xmlschemastypes.c revision 7f6e02432dbe40f0d6ab3efa82e488420db68b4c
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/* 3224255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaInitTypes: 3234255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 3244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Initialize the default XML Schemas type library 3254255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 3264255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid 3276560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel VeillardxmlSchemaInitTypes(void) 3286560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard{ 3294255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (xmlSchemaTypesInitialized != 0) 3306560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard return; 3314255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaTypesBank = xmlHashCreate(40); 3326560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard 33301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 334c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard /* 33501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 3.4.7 Built-in Complex Type Definition 33601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 3378bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeAnyTypeDef = xmlSchemaInitBasicType("anyType", 3382f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack XML_SCHEMAS_ANYTYPE, 33901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard NULL); 34001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnyTypeDef->baseType = xmlSchemaTypeAnyTypeDef; 34101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnyTypeDef->contentType = XML_SCHEMA_CONTENT_MIXED; 34201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard { 34301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaWildcardPtr wild; 34401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 34501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard wild = (xmlSchemaWildcardPtr) xmlMalloc(sizeof(xmlSchemaWildcard)); 34601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (wild == NULL) { 3472f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack xmlSchemaTypeErrMemory(NULL, "could not create an attribute wildcard on anyType"); 34801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return; 34901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 35001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard memset(wild, 0, sizeof(xmlSchemaWildcard)); 35101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard wild->any = 1; 35201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard wild->processContents = XML_SCHEMAS_ANY_LAX; 35301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard wild->minOccurs = 1; 35401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard wild->maxOccurs = 1; 35501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnyTypeDef->attributeWildcard = wild; 35601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 35701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef = xmlSchemaInitBasicType("anySimpleType", 3582f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack XML_SCHEMAS_ANYSIMPLETYPE, 35901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnyTypeDef); 36001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard /* 36101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * primitive datatypes 36201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 36301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeStringDef = xmlSchemaInitBasicType("string", 36401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_STRING, 36501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3668bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeDecimalDef = xmlSchemaInitBasicType("decimal", 36701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_DECIMAL, 36801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3698bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeDateDef = xmlSchemaInitBasicType("date", 37001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_DATE, 37101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3728bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeDatetimeDef = xmlSchemaInitBasicType("dateTime", 37301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_DATETIME, 37401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3758bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeTimeDef = xmlSchemaInitBasicType("time", 37601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_TIME, 37701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3788bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeGYearDef = xmlSchemaInitBasicType("gYear", 37901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_GYEAR, 38001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3818bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeGYearMonthDef = xmlSchemaInitBasicType("gYearMonth", 38201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_GYEARMONTH, 38301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3848bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeGMonthDef = xmlSchemaInitBasicType("gMonth", 38501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_GMONTH, 38601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3878bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeGMonthDayDef = xmlSchemaInitBasicType("gMonthDay", 38801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_GMONTHDAY, 38901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3908bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeGDayDef = xmlSchemaInitBasicType("gDay", 39101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_GDAY, 39201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3938bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeDurationDef = xmlSchemaInitBasicType("duration", 39401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_DURATION, 39501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3968bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeFloatDef = xmlSchemaInitBasicType("float", 39701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_FLOAT, 39801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3998bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeDoubleDef = xmlSchemaInitBasicType("double", 40001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_DOUBLE, 40101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4028bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeBooleanDef = xmlSchemaInitBasicType("boolean", 40301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_BOOLEAN, 40401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4058bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeAnyURIDef = xmlSchemaInitBasicType("anyURI", 40601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_ANYURI, 40701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 408560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard xmlSchemaTypeHexBinaryDef = xmlSchemaInitBasicType("hexBinary", 40901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_HEXBINARY, 41001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaTypeBase64BinaryDef 41201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard = xmlSchemaInitBasicType("base64Binary", XML_SCHEMAS_BASE64BINARY, 41301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 41401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNotationDef = xmlSchemaInitBasicType("NOTATION", 41501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NOTATION, 41601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 41701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeQNameDef = xmlSchemaInitBasicType("QName", 41801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_QNAME, 41901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 421c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard /* 422c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard * derived datatypes 423c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard */ 4248bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeIntegerDef = xmlSchemaInitBasicType("integer", 42501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_INTEGER, 42601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeDecimalDef); 4276560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeNonPositiveIntegerDef = 4286560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaInitBasicType("nonPositiveInteger", 42901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NPINTEGER, 43001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIntegerDef); 4316560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeNegativeIntegerDef = 43201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("negativeInteger", XML_SCHEMAS_NINTEGER, 43301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNonPositiveIntegerDef); 4346560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeLongDef = 43501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("long", XML_SCHEMAS_LONG, 43601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIntegerDef); 43701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIntDef = xmlSchemaInitBasicType("int", XML_SCHEMAS_INT, 43801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeLongDef); 4398bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeShortDef = xmlSchemaInitBasicType("short", 44001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_SHORT, 44101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIntDef); 4428bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeByteDef = xmlSchemaInitBasicType("byte", 44301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_BYTE, 44401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeShortDef); 4456560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeNonNegativeIntegerDef = 4466560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaInitBasicType("nonNegativeInteger", 44701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NNINTEGER, 44801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIntegerDef); 4496560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeUnsignedLongDef = 45001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("unsignedLong", XML_SCHEMAS_ULONG, 45101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNonNegativeIntegerDef); 4526560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeUnsignedIntDef = 45301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("unsignedInt", XML_SCHEMAS_UINT, 45401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeUnsignedLongDef); 4556560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeUnsignedShortDef = 45601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("unsignedShort", XML_SCHEMAS_USHORT, 45701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeUnsignedIntDef); 4586560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeUnsignedByteDef = 45901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("unsignedByte", XML_SCHEMAS_UBYTE, 46001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeUnsignedShortDef); 4616560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypePositiveIntegerDef = 46201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("positiveInteger", XML_SCHEMAS_PINTEGER, 46301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNonNegativeIntegerDef); 4648bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeNormStringDef = xmlSchemaInitBasicType("normalizedString", 46501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NORMSTRING, 46601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeStringDef); 4678bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeTokenDef = xmlSchemaInitBasicType("token", 46801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_TOKEN, 46901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNormStringDef); 4708bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeLanguageDef = xmlSchemaInitBasicType("language", 47101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_LANGUAGE, 47201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeTokenDef); 47301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNameDef = xmlSchemaInitBasicType("Name", 47401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NAME, 47501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeTokenDef); 47601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNmtokenDef = xmlSchemaInitBasicType("NMTOKEN", 47701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NMTOKEN, 4784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeTokenDef); 47901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNCNameDef = xmlSchemaInitBasicType("NCName", 48001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NCNAME, 48101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNameDef); 48201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIdDef = xmlSchemaInitBasicType("ID", XML_SCHEMAS_ID, 4834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeNCNameDef); 4848bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeIdrefDef = xmlSchemaInitBasicType("IDREF", 48501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_IDREF, 4864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeNCNameDef); 487a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard xmlSchemaTypeEntityDef = xmlSchemaInitBasicType("ENTITY", 48801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_ENTITY, 48901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNCNameDef); 4904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik /* 4914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Derived list types. 4924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik */ 4934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik /* ENTITIES */ 494a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard xmlSchemaTypeEntitiesDef = xmlSchemaInitBasicType("ENTITIES", 49501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_ENTITIES, 4964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeAnySimpleTypeDef); 4974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeEntitiesDef->subtypes = xmlSchemaTypeEntityDef; 4984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik /* IDREFS */ 4994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeIdrefsDef = xmlSchemaInitBasicType("IDREFS", 5004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik XML_SCHEMAS_IDREFS, 5014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeAnySimpleTypeDef); 5024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeIdrefsDef->subtypes = xmlSchemaTypeIdrefDef; 5034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 5044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik /* NMTOKENS */ 5054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeNmtokensDef = xmlSchemaInitBasicType("NMTOKENS", 5064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik XML_SCHEMAS_NMTOKENS, 5074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeAnySimpleTypeDef); 5084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeNmtokensDef->subtypes = xmlSchemaTypeNmtokenDef; 5094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 5104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaTypesInitialized = 1; 5114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 5124255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 5134255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 5144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCleanupTypes: 5154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 5164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Cleanup the default XML Schemas type library 5174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 5184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid 5194255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaCleanupTypes(void) { 5204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (xmlSchemaTypesInitialized == 0) 5214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return; 52201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaFreeWildcard(xmlSchemaTypeAnyTypeDef->attributeWildcard); 5234255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlHashFree(xmlSchemaTypesBank, (xmlHashDeallocator) xmlSchemaFreeType); 5244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaTypesInitialized = 0; 5254255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 5264255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 5274255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 5286927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaIsBuiltInTypeFacet: 52901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type: the built-in type 53001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @facetType: the facet type 53101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 53201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Evaluates if a specific facet can be 53301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * used in conjunction with a type. 53401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 53501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns 1 if the facet can be used with the given built-in type, 53601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 0 otherwise and -1 in case the type is not a built-in type. 53701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 53801fa6156e51259229470f40619af93e915b4bc94Daniel Veillardint 53901fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaIsBuiltInTypeFacet(xmlSchemaTypePtr type, int facetType) 54001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{ 541ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard if (type == NULL) 542ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard return (-1); 54301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (type->type != XML_SCHEMA_TYPE_BASIC) 54401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (-1); 54501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard switch (type->builtInType) { 54601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_BOOLEAN: 54701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if ((facetType == XML_SCHEMA_FACET_PATTERN) || 54801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_WHITESPACE)) 54901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (1); 55001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard else 55101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (0); 55201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_STRING: 55301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NOTATION: 55401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_QNAME: 55501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ANYURI: 55601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_BASE64BINARY: 55701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_HEXBINARY: 55801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if ((facetType == XML_SCHEMA_FACET_LENGTH) || 55901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MINLENGTH) || 56001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MAXLENGTH) || 56101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_PATTERN) || 56201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_ENUMERATION) || 56301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_WHITESPACE)) 56401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (1); 56501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard else 56601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (0); 56701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DECIMAL: 56801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if ((facetType == XML_SCHEMA_FACET_TOTALDIGITS) || 56901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_FRACTIONDIGITS) || 57001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_PATTERN) || 57101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_WHITESPACE) || 57201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_ENUMERATION) || 57301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) || 57401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) || 57501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MININCLUSIVE) || 57601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MINEXCLUSIVE)) 57701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (1); 57801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard else 57901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (0); 58001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_TIME: 58101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GDAY: 58201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GMONTH: 58301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 58401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GYEAR: 58501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 58601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DATE: 58701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DATETIME: 58801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DURATION: 58901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_FLOAT: 59001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DOUBLE: 59101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if ((facetType == XML_SCHEMA_FACET_PATTERN) || 59201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_ENUMERATION) || 59301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_WHITESPACE) || 59401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) || 59501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) || 59601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MININCLUSIVE) || 59701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MINEXCLUSIVE)) 59801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (1); 59901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard else 60001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (0); 60101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard default: 602c7e3cc49bade82dba0cda4ae7c07ffcd1e32fe25Daniel Veillard break; 60301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 60401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (0); 60501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard} 60601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 60701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/** 60801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaGetBuiltInType: 60901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type: the type of the built in type 61001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 61101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Gives you the type struct for a built-in 61201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * type by its type id. 61301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 61401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns the type if found, NULL otherwise. 61501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 61601fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaTypePtr 61701fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaGetBuiltInType(xmlSchemaValType type) 61801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{ 61901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (xmlSchemaTypesInitialized == 0) 62001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitTypes(); 62101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard switch (type) { 62201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 62301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ANYSIMPLETYPE: 62401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeAnySimpleTypeDef); 62501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_STRING: 62601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeStringDef); 62701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NORMSTRING: 62801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNormStringDef); 62901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DECIMAL: 63001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeDecimalDef); 63101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_TIME: 63201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeTimeDef); 63301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GDAY: 63401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeGDayDef); 63501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GMONTH: 63601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeGMonthDef); 63701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 63801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeGMonthDayDef); 63901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GYEAR: 64001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeGYearDef); 64101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 64201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeGYearMonthDef); 64301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DATE: 64401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeDateDef); 64501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DATETIME: 64601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeDatetimeDef); 64701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DURATION: 64801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeDurationDef); 64901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_FLOAT: 65001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeFloatDef); 65101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DOUBLE: 65201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeDoubleDef); 65301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_BOOLEAN: 65401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeBooleanDef); 65501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_TOKEN: 65601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeTokenDef); 65701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_LANGUAGE: 65801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeLanguageDef); 65901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NMTOKEN: 66001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNmtokenDef); 66101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NMTOKENS: 66201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNmtokensDef); 66301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NAME: 66401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNameDef); 66501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_QNAME: 66601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeQNameDef); 66701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NCNAME: 66801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNCNameDef); 66901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ID: 67001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeIdDef); 67101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_IDREF: 67201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeIdrefDef); 67301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_IDREFS: 67401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeIdrefsDef); 67501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ENTITY: 67601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeEntityDef); 67701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ENTITIES: 67801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeEntitiesDef); 67901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NOTATION: 68001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNotationDef); 68101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ANYURI: 68201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeAnyURIDef); 68301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_INTEGER: 68401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeIntegerDef); 68501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NPINTEGER: 68601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNonPositiveIntegerDef); 68701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NINTEGER: 68801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNegativeIntegerDef); 68901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NNINTEGER: 69001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNonNegativeIntegerDef); 69101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_PINTEGER: 69201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypePositiveIntegerDef); 69301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_INT: 69401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeIntDef); 69501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_UINT: 69601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeUnsignedIntDef); 69701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_LONG: 69801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeLongDef); 69901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ULONG: 70001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeUnsignedLongDef); 70101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_SHORT: 70201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeShortDef); 70301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_USHORT: 70401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeUnsignedShortDef); 70501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_BYTE: 70601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeByteDef); 70701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_UBYTE: 70801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeUnsignedByteDef); 70901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_HEXBINARY: 71001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeHexBinaryDef); 71101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_BASE64BINARY: 71201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeBase64BinaryDef); 71301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ANYTYPE: 71401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeAnyTypeDef); 71501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard default: 71601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (NULL); 71701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 71801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard} 71901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 7207f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik/** 7217f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * xmlSchemaValueAppend: 7227f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @prev: the value 7237f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @cur: the value to be appended 7247f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * 7257f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Appends a next sibling to a list of computed values. 7267f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * 7277f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Returns 0 if succeeded and -1 on API errors. 7287f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik */ 7294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcikint 7304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValueAppend(xmlSchemaValPtr prev, xmlSchemaValPtr cur) { 7314255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 7324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((prev == NULL) || (cur == NULL)) 7334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (-1); 7344efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik prev->next = cur; 7354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (0); 7364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik} 7374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 7387f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik/** 7397f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * xmlSchemaValueGetNext: 7407f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @cur: the value 7417f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * 7427f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Accessor for the next sibling of a list of computed values. 7437f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * 7447f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Returns the next value or NULL if there was none, or on 7457f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * API errors. 7467f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik */ 7474efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValPtr 7484efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValueGetNext(xmlSchemaValPtr cur) { 7494efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 7504efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (cur == NULL) 7514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (NULL); 7524efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (cur->next); 7534efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik} 7544efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 7557f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik/** 7567f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * xmlSchemaValueGetAsString: 7577f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @val: the value 7587f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * 7597f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Accessor for the string value of a computed value. 7607f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * 7617f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Returns the string value or NULL if there was none, or on 7627f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * API errors. 7637f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik */ 7644efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcikconst xmlChar * 7654efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValueGetAsString(xmlSchemaValPtr val) 7664efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik{ 7674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (val == NULL) 7684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (NULL); 7694efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik switch (val->type) { 7704efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_STRING: 7714efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NORMSTRING: 7724efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYSIMPLETYPE: 7734efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_TOKEN: 7744efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_LANGUAGE: 7754efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NMTOKEN: 7764efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NAME: 7774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NCNAME: 7784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ID: 7794efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_IDREF: 7804efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ENTITY: 7814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYURI: 7824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (BAD_CAST val->value.str); 7834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik default: 7844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 7854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 7864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (NULL); 7874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik} 7884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 7897f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik/** 7907f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * xmlSchemaValueGetAsBoolean: 7917f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @val: the value 7927f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * 7937f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Accessor for the boolean value of a computed value. 7947f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * 7957f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Returns 1 if true and 0 if false, or in case of an error. Hmm. 7967f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik */ 7974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcikint 7984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValueGetAsBoolean(xmlSchemaValPtr val) 7994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik{ 8004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((val == NULL) || (val->type != XML_SCHEMAS_BOOLEAN)) 8014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (0); 8024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (val->value.b); 8034255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 8044255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 8054255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 8066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaNewStringValue: 8076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @type: the value type 808b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard * @value: the value 8096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 8106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Allocate a new simple type value. The type can be 8112ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * of XML_SCHEMAS_STRING. 8122ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * WARNING: This one is intended to be expanded for other 8132ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * string based types. We need this for anySimpleType as well. 8144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * The given value is consumed and freed with the struct. 8156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 8166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns a pointer to the new value or NULL in case of error 8176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 8186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaValPtr 8196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaNewStringValue(xmlSchemaValType type, 8206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik const xmlChar *value) 8216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 8226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xmlSchemaValPtr val; 8236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 8246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (type != XML_SCHEMAS_STRING) 8256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(NULL); 8266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik val = (xmlSchemaValPtr) xmlMalloc(sizeof(xmlSchemaVal)); 8276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (val == NULL) { 8286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(NULL); 8296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 8306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik memset(val, 0, sizeof(xmlSchemaVal)); 8316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik val->type = type; 8326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik val->value.str = (xmlChar *) value; 8336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(val); 8346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 8356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 836b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik/** 837b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * xmlSchemaNewNOTATIONValue: 838b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard * @name: the notation name 839b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard * @ns: the notation namespace name or NULL 840b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * 841b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * Allocate a new NOTATION value. 8424efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * The given values are consumed and freed with the struct. 843b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * 844b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * Returns a pointer to the new value or NULL in case of error 845b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik */ 846b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. BuchcikxmlSchemaValPtr 847b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. BuchcikxmlSchemaNewNOTATIONValue(const xmlChar *name, 848b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik const xmlChar *ns) 849b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik{ 850b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik xmlSchemaValPtr val; 851b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik 852b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik val = xmlSchemaNewValue(XML_SCHEMAS_NOTATION); 853b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik if (val == NULL) 854b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik return (NULL); 855b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik 85612d37ab63441baf9e03db70168cc1d0d6f1c2373William M. Brack val->value.qname.name = (xmlChar *)name; 857b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik if (ns != NULL) 85812d37ab63441baf9e03db70168cc1d0d6f1c2373William M. Brack val->value.qname.uri = (xmlChar *)ns; 859b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik return(val); 860b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik} 8616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 8626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 8634efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * xmlSchemaNewQNameValue: 8644efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * @namespaceName: the namespace name 8654efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * @localName: the local name 8664efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * 8674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Allocate a new QName value. 8684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * The given values are consumed and freed with the struct. 8694efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * 8704efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Returns a pointer to the new value or NULL in case of an error. 8714efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik */ 8724efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValPtr 8734efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaNewQNameValue(const xmlChar *namespaceName, 8744efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik const xmlChar *localName) 8754efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik{ 8764efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaValPtr val; 8774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 8784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik val = xmlSchemaNewValue(XML_SCHEMAS_QNAME); 8794efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (val == NULL) 8804efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (NULL); 8814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 8824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik val->value.qname.name = (xmlChar *) localName; 8834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik val->value.qname.uri = (xmlChar *) namespaceName; 8844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return(val); 8854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik} 8864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 8874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik/** 8884255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaFreeValue: 8894255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value: the value to free 8904255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 8914255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Cleanup the default XML Schemas type library 8924255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 8934255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid 8944255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaFreeValue(xmlSchemaValPtr value) { 8954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaValPtr prev; 8964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 8974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while (value != NULL) { 8984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik switch (value->type) { 8994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_STRING: 9004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NORMSTRING: 9014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_TOKEN: 9024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_LANGUAGE: 9034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NMTOKEN: 9044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NMTOKENS: 9054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NAME: 9064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NCNAME: 9074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ID: 9084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_IDREF: 9094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_IDREFS: 9104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ENTITY: 9114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ENTITIES: 9124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYURI: 9134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYSIMPLETYPE: 9144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (value->value.str != NULL) 9154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlFree(value->value.str); 9164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 9174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NOTATION: 9184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_QNAME: 9194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (value->value.qname.uri != NULL) 9204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlFree(value->value.qname.uri); 9214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (value->value.qname.name != NULL) 9224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlFree(value->value.qname.name); 9234efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 9244efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_HEXBINARY: 9254efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (value->value.hex.str != NULL) 9264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlFree(value->value.hex.str); 9274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 9284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_BASE64BINARY: 9294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (value->value.base64.str != NULL) 9304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlFree(value->value.base64.str); 9314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 9324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik default: 9334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 9344efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 9354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik prev = value; 9364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik value = value->next; 9374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlFree(prev); 9384efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 9394255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 9404255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 9414255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 9424255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaGetPredefinedType: 9434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @name: the type name 9444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @ns: the URI of the namespace usually "http://www.w3.org/2001/XMLSchema" 9454255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 9464255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Lookup a type in the default XML Schemas type library 9474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 9484255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns the type if found, NULL otherwise 9494255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 9504255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaTypePtr 9514255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaGetPredefinedType(const xmlChar *name, const xmlChar *ns) { 9524255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (xmlSchemaTypesInitialized == 0) 9534255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaInitTypes(); 9544255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (name == NULL) 9554255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(NULL); 9564255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return((xmlSchemaTypePtr) xmlHashLookup2(xmlSchemaTypesBank, name, ns)); 9574255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 958070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 95901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/** 96001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaGetBuiltInListSimpleTypeItemType: 96101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type: the built-in simple type. 96201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 9636927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Lookup function 9646927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * 965c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns the item type of @type as defined by the built-in datatype 966c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * hierarchy of XML Schema Part 2: Datatypes, or NULL in case of an error. 96701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 96801fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaTypePtr 96901fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaGetBuiltInListSimpleTypeItemType(xmlSchemaTypePtr type) 97001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{ 9714259532303e96e089a185c6f55056cb7c4902d71Daniel Veillard if ((type == NULL) || (type->type != XML_SCHEMA_TYPE_BASIC)) 97201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (NULL); 97301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard switch (type->builtInType) { 97401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NMTOKENS: 97501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNmtokenDef ); 97601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_IDREFS: 97701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeIdrefDef); 97801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ENTITIES: 97901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeEntityDef); 98001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard default: 98101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (NULL); 98201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 98301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard} 98401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 985070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**************************************************************** 986070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * * 987070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Convenience macros and functions * 988070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * * 989070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ****************************************************************/ 990070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 991070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define IS_TZO_CHAR(c) \ 992070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ((c == 0) || (c == 'Z') || (c == '+') || (c == '-')) 993070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 994070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_YEAR(yr) (yr != 0) 995070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MONTH(mon) ((mon >= 1) && (mon <= 12)) 996070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* VALID_DAY should only be used when month is unknown */ 997070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DAY(day) ((day >= 1) && (day <= 31)) 998070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_HOUR(hr) ((hr >= 0) && (hr <= 23)) 999070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MIN(min) ((min >= 0) && (min <= 59)) 1000070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_SEC(sec) ((sec >= 0) && (sec < 60)) 1001690a68095f589248c9e962c6b5468aacb6d3aabaKasimier T. Buchcik#define VALID_TZO(tzo) ((tzo > -840) && (tzo < 840)) 1002070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define IS_LEAP(y) \ 1003070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)) 1004070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1005ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillardstatic const unsigned int daysInMonth[12] = 1006070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; 1007ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillardstatic const unsigned int daysInMonthLeap[12] = 1008070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; 1009070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 10105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MAX_DAYINMONTH(yr,mon) \ 10115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (IS_LEAP(yr) ? daysInMonthLeap[mon - 1] : daysInMonth[mon - 1]) 10125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 1013070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MDAY(dt) \ 1014070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (IS_LEAP(dt->year) ? \ 1015070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (dt->day <= daysInMonthLeap[dt->mon - 1]) : \ 1016070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (dt->day <= daysInMonth[dt->mon - 1])) 1017070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1018070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DATE(dt) \ 1019070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (VALID_YEAR(dt->year) && VALID_MONTH(dt->mon) && VALID_MDAY(dt)) 1020070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1021070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_TIME(dt) \ 1022070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (VALID_HOUR(dt->hour) && VALID_MIN(dt->min) && \ 1023070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard VALID_SEC(dt->sec) && VALID_TZO(dt->tzo)) 1024070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1025070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DATETIME(dt) \ 1026070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (VALID_DATE(dt) && VALID_TIME(dt)) 1027070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1028070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_MIN (60) 1029070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_HOUR (60 * SECS_PER_MIN) 1030070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_DAY (24 * SECS_PER_HOUR) 1031070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 10325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic const long dayInYearByMonth[12] = 10335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }; 10345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic const long dayInLeapYearByMonth[12] = 10355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 }; 10365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 10375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DAY_IN_YEAR(day, month, year) \ 10385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ((IS_LEAP(year) ? \ 10395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dayInLeapYearByMonth[month - 1] : \ 10405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dayInYearByMonth[month - 1]) + day) 10415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 10425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#ifdef DEBUG 10435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DEBUG_DATE(dt) \ 10445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlGenericError(xmlGenericErrorContext, \ 10455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard "type=%o %04ld-%02u-%02uT%02u:%02u:%03f", \ 10465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dt->type,dt->value.date.year,dt->value.date.mon, \ 10475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dt->value.date.day,dt->value.date.hour,dt->value.date.min, \ 10485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dt->value.date.sec); \ 10495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dt->value.date.tz_flag) \ 10505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dt->value.date.tzo != 0) \ 10515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlGenericError(xmlGenericErrorContext, \ 10525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard "%+05d\n",dt->value.date.tzo); \ 10535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else \ 10545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlGenericError(xmlGenericErrorContext, "Z\n"); \ 10555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else \ 10565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlGenericError(xmlGenericErrorContext,"\n") 10575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#else 10585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DEBUG_DATE(dt) 10595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#endif 10605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 1061070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1062070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGYear: 1063070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 1064070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 1065070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1066070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gYear without time zone and fills in the appropriate 1067070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the 1068070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gYear. It is supposed that @dt->year is big enough to contain 1069070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * the year. 1070070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1071070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 1072070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1073070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1074070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGYear (xmlSchemaValDatePtr dt, const xmlChar **str) { 1075070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = *str, *firstChar; 1076070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int isneg = 0, digcnt = 0; 1077070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1078070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (((*cur < '0') || (*cur > '9')) && 1079070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (*cur != '-') && (*cur != '+')) 1080070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1081070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1082070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == '-') { 1083070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard isneg = 1; 1084070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1085070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1086070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1087070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard firstChar = cur; 1088070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1089070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { 1090070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->year = dt->year * 10 + (*cur - '0'); 1091070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1092070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard digcnt++; 1093070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1094070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1095070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* year must be at least 4 digits (CCYY); over 4 1096070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * digits cannot have a leading zero. */ 1097070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((digcnt < 4) || ((digcnt > 4) && (*firstChar == '0'))) 1098070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1099070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1100070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (isneg) 1101070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->year = - dt->year; 1102070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1103070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_YEAR(dt->year)) 1104070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1105070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1106070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 1107070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1108070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1109070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1110070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1111070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_2_DIGITS: 1112070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num: the integer to fill in 1113070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur: an #xmlChar * 1114070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @invalid: an integer 1115070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1116070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a 2-digits integer and updates @num with the value. @cur is 1117070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the integer. 1118070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @invalid is set to %TRUE, values of @num and 1119070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined. 1120070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1121070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_2_DIGITS(num, cur, invalid) \ 1122070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((cur[0] < '0') || (cur[0] > '9') || \ 1123070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (cur[1] < '0') || (cur[1] > '9')) \ 1124070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard invalid = 1; \ 1125070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else \ 1126070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num = (cur[0] - '0') * 10 + (cur[1] - '0'); \ 1127070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur += 2; 1128070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1129070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1130070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_FLOAT: 1131070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num: the double to fill in 1132070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur: an #xmlChar * 1133070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @invalid: an integer 1134070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1135070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a float and updates @num with the value. @cur is 1136070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the float. The float must have a 1137070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 2-digits integer part and may or may not have a decimal part. 1138070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @invalid is set to %TRUE, values of @num and 1139070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined. 1140070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1141070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_FLOAT(num, cur, invalid) \ 1142070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(num, cur, invalid); \ 1143070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!invalid && (*cur == '.')) { \ 1144070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard double mult = 1; \ 1145070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 1146070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur < '0') || (*cur > '9')) \ 1147070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard invalid = 1; \ 1148070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { \ 1149070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard mult /= 10; \ 1150070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num += (*cur - '0') * mult; \ 1151070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 1152070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } \ 1153070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1154070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1155070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1156070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGMonth: 1157070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 1158070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 1159070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1160070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gMonth without time zone and fills in the appropriate 1161070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the 1162070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gMonth. 1163070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1164070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 1165070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1166070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1167070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGMonth (xmlSchemaValDatePtr dt, const xmlChar **str) { 1168070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = *str; 1169070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret = 0; 117064dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik unsigned int value = 0; 1171070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 117264dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik PARSE_2_DIGITS(value, cur, ret); 1173070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1174070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1175070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 117664dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik if (!VALID_MONTH(value)) 1177070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1178070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 117964dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik dt->mon = value; 118064dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik 1181070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 1182070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1183070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1184070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1185070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1186070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGDay: 1187070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 1188070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 1189070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1190070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gDay without time zone and fills in the appropriate 1191070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the 1192070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gDay. 1193070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1194070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 1195070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1196070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1197070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGDay (xmlSchemaValDatePtr dt, const xmlChar **str) { 1198070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = *str; 1199070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret = 0; 120064dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik unsigned int value = 0; 1201070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 120264dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik PARSE_2_DIGITS(value, cur, ret); 1203070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1204070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1205070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 120664dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik if (!VALID_DAY(value)) 1207070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1208070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 120964dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik dt->day = value; 1210070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 1211070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1212070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1213070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1214070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1215070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseTime: 1216070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 1217070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 1218070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1219070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:time without time zone and fills in the appropriate 1220070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * fields of the @dt structure. @str is updated to point just after the 1221070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:time. 1222070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, values of @dt fields are undefined. 1223070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1224070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 1225070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1226070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1227070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseTime (xmlSchemaValDatePtr dt, const xmlChar **str) { 1228285b36722a9044d261028168cb74601c989a110cKasimier T. Buchcik const xmlChar *cur = *str; 1229070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret = 0; 1230285b36722a9044d261028168cb74601c989a110cKasimier T. Buchcik int value = 0; 1231070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 123264dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik PARSE_2_DIGITS(value, cur, ret); 1233070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 123464dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik return ret; 1235070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != ':') 1236070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 123764dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik if (!VALID_HOUR(value)) 123864dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik return 2; 1239070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1240070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1241070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* the ':' insures this string is xs:time */ 124264dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik dt->hour = value; 1243070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 124464dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik PARSE_2_DIGITS(value, cur, ret); 1245070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1246070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 124764dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik if (!VALID_MIN(value)) 124864dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik return 2; 124964dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik dt->min = value; 1250070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1251070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != ':') 1252070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1253070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1254070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1255070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_FLOAT(dt->sec, cur, ret); 1256070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1257070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1258070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 125964dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik if ((!VALID_SEC(dt->sec)) || (!VALID_TZO(dt->tzo))) 1260070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1261070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1262070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 1263070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1264070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1265070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1266070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1267070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseTimeZone: 1268070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 1269070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 1270070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1271070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a time zone without time zone and fills in the appropriate 1272070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the 1273070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * time zone. 1274070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1275070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 1276070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1277070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1278070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseTimeZone (xmlSchemaValDatePtr dt, const xmlChar **str) { 1279070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = *str; 1280070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret = 0; 1281070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1282070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (str == NULL) 1283070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1284070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1285070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard switch (*cur) { 1286070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case 0: 1287070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tz_flag = 0; 1288070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo = 0; 1289070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1290070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1291070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case 'Z': 1292070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tz_flag = 1; 1293070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo = 0; 1294070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1295070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1296070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1297070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case '+': 1298070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case '-': { 1299070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int isneg = 0, tmp = 0; 1300070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard isneg = (*cur == '-'); 1301070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1302070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1303070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1304070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(tmp, cur, ret); 1305070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1306070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1307070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_HOUR(tmp)) 1308070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1309070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1310070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != ':') 1311070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1312070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1313070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1314070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo = tmp * 60; 1315070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1316070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(tmp, cur, ret); 1317070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1318070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1319070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_MIN(tmp)) 1320070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1321070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1322070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo += tmp; 1323070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (isneg) 1324070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo = - dt->tzo; 1325070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1326070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_TZO(dt->tzo)) 1327070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1328070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 13295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dt->tz_flag = 1; 1330070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1331070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1332070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard default: 1333070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1334070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1335070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1336070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 1337070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1338070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1339070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 13401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard/** 13411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * _xmlSchemaBase64Decode: 13421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * @ch: a character 13431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 13441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Converts a base64 encoded character to its base 64 value. 13451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 13461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Returns 0-63 (value), 64 (pad), or -1 (not recognized) 13471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard */ 13481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardstatic int 13491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard_xmlSchemaBase64Decode (const xmlChar ch) { 13501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (('A' <= ch) && (ch <= 'Z')) return ch - 'A'; 13511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (('a' <= ch) && (ch <= 'z')) return ch - 'a' + 26; 13521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (('0' <= ch) && (ch <= '9')) return ch - '0' + 52; 13531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ('+' == ch) return 62; 13541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ('/' == ch) return 63; 13551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ('=' == ch) return 64; 13561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return -1; 13571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard} 13581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 1359070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**************************************************************** 1360070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * * 1361070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * XML Schema Dates/Times Datatypes Handling * 1362070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * * 1363070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ****************************************************************/ 1364070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1365070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1366070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_DIGITS: 1367070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num: the integer to fill in 1368070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur: an #xmlChar * 1369070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num_type: an integer flag 1370070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1371070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a digits integer and updates @num with the value. @cur is 1372070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the integer. 1373070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @num_type is set to -1, values of @num and 1374070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined. 1375070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1376070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_DIGITS(num, cur, num_type) \ 1377070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur < '0') || (*cur > '9')) \ 1378070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num_type = -1; \ 1379070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else \ 1380070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { \ 1381070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num = num * 10 + (*cur - '0'); \ 1382070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 1383070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1384070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1385070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1386070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_NUM: 1387070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num: the double to fill in 1388070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur: an #xmlChar * 1389070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num_type: an integer flag 1390070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1391070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a float or integer and updates @num with the value. @cur is 1392070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the number. If the number is a float, 1393070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * then it must have an integer part and a decimal part; @num_type will 1394070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * be set to 1. If there is no decimal part, @num_type is set to zero. 1395070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @num_type is set to -1, values of @num and 1396070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined. 1397070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1398070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_NUM(num, cur, num_type) \ 1399070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num = 0; \ 1400070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_DIGITS(num, cur, num_type); \ 1401070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!num_type && (*cur == '.')) { \ 1402070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard double mult = 1; \ 1403070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 1404070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur < '0') || (*cur > '9')) \ 1405070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num_type = -1; \ 1406070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else \ 1407070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num_type = 1; \ 1408070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { \ 1409070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard mult /= 10; \ 1410070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num += (*cur - '0') * mult; \ 1411070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 1412070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } \ 1413070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1414070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1415070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 14165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaValidateDates: 1417455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard * @type: the expected type or XML_SCHEMAS_UNKNOWN 1418070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dateTime: string to analyze 1419070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @val: the return computed value 1420070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1421070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Check that @dateTime conforms to the lexical space of one of the date types. 1422070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * if true a value is computed and returned in @val. 1423070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1424070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 1425070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * and -1 in case of internal or API error. 1426070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1427070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1428455cc07308c673b6714e2f5670c2091a1dab95dcDaniel VeillardxmlSchemaValidateDates (xmlSchemaValType type, 14294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik const xmlChar *dateTime, xmlSchemaValPtr *val, 14304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik int collapse) { 1431070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaValPtr dt; 1432070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret; 1433070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = dateTime; 1434070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1435070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define RETURN_TYPE_IF_VALID(t) \ 1436070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (IS_TZO_CHAR(*cur)) { \ 1437070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur); \ 1438070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == 0) { \ 1439070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != 0) \ 1440070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; \ 1441070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->type = t; \ 1442455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard goto done; \ 1443070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } \ 1444070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1445070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1446070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dateTime == NULL) 1447070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1448070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 14494efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (collapse) 14504efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 14514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 1452070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur != '-') && (*cur < '0') && (*cur > '9')) 1453070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1454070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1455070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt = xmlSchemaNewValue(XML_SCHEMAS_UNKNOWN); 1456070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dt == NULL) 1457070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1458070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1459070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((cur[0] == '-') && (cur[1] == '-')) { 1460070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* 1461070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * It's an incomplete date (xs:gMonthDay, xs:gMonth or 1462070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gDay) 1463070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1464070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur += 2; 1465070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1466070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* is it an xs:gDay? */ 1467070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == '-') { 1468455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard if (type == XML_SCHEMAS_GMONTH) 1469455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard goto error; 1470070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ++cur; 1471070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGDay(&(dt->value.date), &cur); 1472070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1473070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1474070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1475070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GDAY); 1476070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1477070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1478070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1479070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1480070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* 1481070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * it should be an xs:gMonthDay or xs:gMonth 1482070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1483070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur); 1484070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1485070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1486070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1487d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* 1488d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * a '-' char could indicate this type is xs:gMonthDay or 1489d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * a negative time zone offset. Check for xs:gMonthDay first. 1490d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * Also the first three char's of a negative tzo (-MM:SS) can 1491d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * appear to be a valid day; so even if the day portion 1492d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * of the xs:gMonthDay verifies, we must insure it was not 1493d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * a tzo. 1494d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard */ 1495d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if (*cur == '-') { 1496d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard const xmlChar *rewnd = cur; 1497d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard cur++; 1498d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1499d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard ret = _xmlSchemaParseGDay(&(dt->value.date), &cur); 1500d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((ret == 0) && ((*cur == 0) || (*cur != ':'))) { 1501d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1502d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* 1503d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * we can use the VALID_MDAY macro to validate the month 1504d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * and day because the leap year test will flag year zero 1505d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * as a leap year (even though zero is an invalid year). 15064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * FUTURE TODO: Zero will become valid in XML Schema 1.1 15074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * probably. 1508d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard */ 1509d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if (VALID_MDAY((&(dt->value.date)))) { 1510d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1511d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTHDAY); 1512070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1513d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1514d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard } 1515d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard } 1516d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1517d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* 1518d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * not xs:gMonthDay so rewind and check if just xs:gMonth 1519d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * with an optional time zone. 1520d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard */ 1521d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard cur = rewnd; 1522d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard } 1523d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1524d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTH); 1525070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1526070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1527070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1528070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1529070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* 1530070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * It's a right-truncated date or an xs:time. 1531070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Try to parse an xs:time then fallback on right-truncated dates. 1532070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1533070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur >= '0') && (*cur <= '9')) { 1534070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseTime(&(dt->value.date), &cur); 1535070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == 0) { 1536070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* it's an xs:time */ 1537070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_TIME); 1538070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1539070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1540070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1541070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* fallback on date parsing */ 1542070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur = dateTime; 1543070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1544070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGYear(&(dt->value.date), &cur); 1545070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1546070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1547070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1548070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* is it an xs:gYear? */ 1549070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEAR); 1550070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1551070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != '-') 1552070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1553070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1554070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1555070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur); 1556070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1557070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1558070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1559070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* is it an xs:gYearMonth? */ 1560070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEARMONTH); 1561070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1562070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != '-') 1563070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1564070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1565070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1566070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGDay(&(dt->value.date), &cur); 1567070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((ret != 0) || !VALID_DATE((&(dt->value.date)))) 1568070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1569070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1570070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* is it an xs:date? */ 1571070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_DATE); 1572070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1573070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != 'T') 1574070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1575070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1576070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1577070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* it should be an xs:dateTime */ 1578070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseTime(&(dt->value.date), &cur); 1579070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1580070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1581070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1582070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur); 15834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (collapse) 15844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 1585070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((ret != 0) || (*cur != 0) || !VALID_DATETIME((&(dt->value.date)))) 1586070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1587070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1588455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard 1589070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->type = XML_SCHEMAS_DATETIME; 1590070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1591455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillarddone: 1592d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard#if 1 1593d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type)) 1594d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1595d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard#else 1596d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* 1597d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * insure the parsed type is equal to or less significant (right 1598d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * truncated) than the desired type. 1599d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard */ 1600d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type)) { 1601d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1602d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* time only matches time */ 1603d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_TIME) && (dt->type == XML_SCHEMAS_TIME)) 1604d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1605d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1606d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_DATETIME) && 1607d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard ((dt->type != XML_SCHEMAS_DATE) || 1608d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard (dt->type != XML_SCHEMAS_GYEARMONTH) || 1609d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard (dt->type != XML_SCHEMAS_GYEAR))) 1610d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1611d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1612d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_DATE) && 1613d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard ((dt->type != XML_SCHEMAS_GYEAR) || 1614d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard (dt->type != XML_SCHEMAS_GYEARMONTH))) 1615d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1616d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1617d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_GYEARMONTH) && (dt->type != XML_SCHEMAS_GYEAR)) 1618d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1619d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1620d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_GMONTHDAY) && (dt->type != XML_SCHEMAS_GMONTH)) 1621d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1622d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard } 1623455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard#endif 1624455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard 1625070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (val != NULL) 1626070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *val = dt; 162780b19092f24410a6b869abf519227686e8f207caDaniel Veillard else 162880b19092f24410a6b869abf519227686e8f207caDaniel Veillard xmlSchemaFreeValue(dt); 1629070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1630070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1631070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1632070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillarderror: 1633070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dt != NULL) 1634070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaFreeValue(dt); 1635070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1636070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1637070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1638070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 16395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaValidateDuration: 1640070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @type: the predefined type 1641070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @duration: string to analyze 1642070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @val: the return computed value 1643070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1644070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Check that @duration conforms to the lexical space of the duration type. 1645070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * if true a value is computed and returned in @val. 1646070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1647070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 1648070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * and -1 in case of internal or API error. 1649070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1650070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1651dda8f1ba9fb2e731e2dd6aa325ed07add7905ec3Daniel VeillardxmlSchemaValidateDuration (xmlSchemaTypePtr type ATTRIBUTE_UNUSED, 16524efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik const xmlChar *duration, xmlSchemaValPtr *val, 16534efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik int collapse) { 1654070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = duration; 1655070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaValPtr dur; 1656070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int isneg = 0; 1657070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard unsigned int seq = 0; 1658d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard double num; 1659d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard int num_type = 0; /* -1 = invalid, 0 = int, 1 = floating */ 1660d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard const xmlChar desig[] = {'Y', 'M', 'D', 'H', 'M', 'S'}; 1661d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard const double multi[] = { 0.0, 0.0, 86400.0, 3600.0, 60.0, 1.0, 0.0}; 1662070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1663070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (duration == NULL) 1664070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1665070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 16664efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (collapse) 16674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 16684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 1669070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == '-') { 1670070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard isneg = 1; 1671070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1672070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1673070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1674070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* duration must start with 'P' (after sign) */ 1675070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur++ != 'P') 1676070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1677070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 167880b19092f24410a6b869abf519227686e8f207caDaniel Veillard if (*cur == 0) 167980b19092f24410a6b869abf519227686e8f207caDaniel Veillard return 1; 168080b19092f24410a6b869abf519227686e8f207caDaniel Veillard 1681070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION); 1682070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dur == NULL) 1683070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1684070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1685070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while (*cur != 0) { 1686070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1687070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* input string should be empty or invalid date/time item */ 1688070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (seq >= sizeof(desig)) 1689070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1690070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1691070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* T designator must be present for time items */ 1692070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == 'T') { 1693070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (seq <= 3) { 1694070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard seq = 3; 1695070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1696070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } else 1697070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1698070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } else if (seq == 3) 1699070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1700070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1701070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* parse the number portion of the item */ 1702070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_NUM(num, cur, num_type); 1703070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1704070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((num_type == -1) || (*cur == 0)) 1705070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1706070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1707070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* update duration based on item type */ 1708070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while (seq < sizeof(desig)) { 1709070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == desig[seq]) { 1710070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1711070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* verify numeric type; only seconds can be float */ 1712070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((num_type != 0) && (seq < (sizeof(desig)-1))) 1713070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1714070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1715070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard switch (seq) { 1716070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case 0: 1717070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.mon = (long)num * 12; 1718070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1719070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case 1: 1720070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.mon += (long)num; 1721070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1722070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard default: 1723070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* convert to seconds using multiplier */ 1724070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.sec += num * multi[seq]; 1725070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard seq++; 1726070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1727070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1728070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1729070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; /* exit loop */ 1730070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1731070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* no date designators found? */ 1732c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((++seq == 3) || (seq == 6)) 1733070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1734070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 17354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 17364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (collapse) 17374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 1738070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1739070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1740070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (isneg) { 1741070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.mon = -dur->value.dur.mon; 1742070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.day = -dur->value.dur.day; 1743070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.sec = -dur->value.dur.sec; 1744070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1745070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1746070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (val != NULL) 1747070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *val = dur; 174880b19092f24410a6b869abf519227686e8f207caDaniel Veillard else 174980b19092f24410a6b869abf519227686e8f207caDaniel Veillard xmlSchemaFreeValue(dur); 1750070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1751070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1752070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1753070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillarderror: 1754070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dur != NULL) 1755070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaFreeValue(dur); 1756070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1757070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1758070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1759a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard/** 1760a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * xmlSchemaStrip: 1761a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * @value: a value 1762a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * 1763a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Removes the leading and ending spaces of a string 1764a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * 1765a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Returns the new string or NULL if no change was required. 1766a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard */ 1767a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillardstatic xmlChar * 1768a1a9d0410000cc69874e53e438b250037d3e14cdDaniel VeillardxmlSchemaStrip(const xmlChar *value) { 1769a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard const xmlChar *start = value, *end, *f; 1770a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard 1771a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard if (value == NULL) return(NULL); 177276e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((*start != 0) && (IS_BLANK_CH(*start))) start++; 1773a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard end = start; 1774a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard while (*end != 0) end++; 1775a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard f = end; 1776a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard end--; 177776e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((end > start) && (IS_BLANK_CH(*end))) end--; 1778a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard end++; 1779a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard if ((start == value) && (f == end)) return(NULL); 1780a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard return(xmlStrndup(start, end - start)); 1781a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard} 178296a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard 178396a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard/** 178491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * xmlSchemaWhiteSpaceReplace: 178591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * @value: a value 178691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * 178791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * Replaces 0xd, 0x9 and 0xa with a space. 178891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * 178991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * Returns the new string or NULL if no change was required. 179091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik */ 179191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. BuchcikxmlChar * 179291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. BuchcikxmlSchemaWhiteSpaceReplace(const xmlChar *value) { 179391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik const xmlChar *cur = value; 179491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik xmlChar *ret = NULL, *mcur; 179591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik 179691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik if (value == NULL) 179791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik return(NULL); 179891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik 179991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik while ((*cur != 0) && 180091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik (((*cur) != 0xd) && ((*cur) != 0x9) && ((*cur) != 0xa))) { 180191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik cur++; 180291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik } 180391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik if (*cur == 0) 180491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik return (NULL); 180591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik ret = xmlStrdup(value); 180691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik /* TODO FIXME: I guess gcc will bark at this. */ 180791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik mcur = (xmlChar *) (ret + (cur - value)); 180891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik do { 180991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik if ( ((*mcur) == 0xd) || ((*mcur) == 0x9) || ((*mcur) == 0xa) ) 181091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik *mcur = ' '; 181191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik mcur++; 181291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik } while (*mcur != 0); 181391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik return(ret); 181491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik} 181591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik 181691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik/** 1817b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaCollapseString: 1818b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @value: a value 1819b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 1820b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Removes and normalize white spaces in the string 1821b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 1822b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns the new string or NULL if no change was required. 1823b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 182401fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlChar * 1825b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaCollapseString(const xmlChar *value) { 1826b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard const xmlChar *start = value, *end, *f; 1827b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlChar *g; 1828b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard int col = 0; 1829b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 1830b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (value == NULL) return(NULL); 183176e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((*start != 0) && (IS_BLANK_CH(*start))) start++; 1832b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end = start; 1833b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard while (*end != 0) { 183476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack if ((*end == ' ') && (IS_BLANK_CH(end[1]))) { 1835b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard col = end - start; 1836b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard break; 1837b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } else if ((*end == 0xa) || (*end == 0x9) || (*end == 0xd)) { 1838b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard col = end - start; 1839b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard break; 1840b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1841b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end++; 1842b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1843b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (col == 0) { 1844b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard f = end; 1845b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end--; 184676e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((end > start) && (IS_BLANK_CH(*end))) end--; 1847b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end++; 1848b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((start == value) && (f == end)) return(NULL); 1849b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(xmlStrndup(start, end - start)); 1850b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1851b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard start = xmlStrdup(start); 1852b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (start == NULL) return(NULL); 1853b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard g = (xmlChar *) (start + col); 1854b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end = g; 1855b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard while (*end != 0) { 185676e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack if (IS_BLANK_CH(*end)) { 1857b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end++; 185876e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*end)) end++; 1859b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (*end != 0) 1860b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *g++ = ' '; 1861b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } else 1862b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *g++ = *end++; 1863b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1864b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *g = 0; 1865b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return((xmlChar *) start); 1866b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard} 1867b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 1868b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/** 186928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * xmlSchemaValAtomicListNode: 187028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @type: the predefined atomic type for a token in the list 187128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @value: the list value to check 187228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @ret: the return computed value 187328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @node: the node containing the value 187428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * 187528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * Check that a value conforms to the lexical space of the predefined 187628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * list type. if true a value is computed and returned in @ret. 187728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * 1878a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Returns the number of items if this validates, a negative error code 1879a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * number otherwise 188028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard */ 188128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillardstatic int 188228c52ab518d34a36fd8da6870a5850088f129a6aDaniel VeillardxmlSchemaValAtomicListNode(xmlSchemaTypePtr type, const xmlChar *value, 188328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard xmlSchemaValPtr *ret, xmlNodePtr node) { 188428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard xmlChar *val, *cur, *endval; 188528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard int nb_values = 0; 1886580ced8ee28ecd99374da9383897678e4ba6c358Daniel Veillard int tmp = 0; 188728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard 188828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (value == NULL) { 188928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard return(-1); 189028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 189128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard val = xmlStrdup(value); 189228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (val == NULL) { 189328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard return(-1); 189428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 18956fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard if (ret != NULL) { 18966fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard *ret = NULL; 18976fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard } 189828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard cur = val; 189928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard /* 190028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * Split the list 190128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard */ 190276e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*cur)) *cur++ = 0; 190328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while (*cur != 0) { 190476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack if (IS_BLANK_CH(*cur)) { 190528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard *cur = 0; 190628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard cur++; 190776e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*cur)) *cur++ = 0; 190828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } else { 190928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard nb_values++; 191028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard cur++; 191176e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((*cur != 0) && (!IS_BLANK_CH(*cur))) cur++; 191228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 191328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 191428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (nb_values == 0) { 191528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard xmlFree(val); 1916a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard return(nb_values); 191728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 191828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard endval = cur; 191928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard cur = val; 192028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while ((*cur == 0) && (cur != endval)) cur++; 192128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while (cur != endval) { 192228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard tmp = xmlSchemaValPredefTypeNode(type, cur, NULL, node); 192328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (tmp != 0) 192428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard break; 192528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while (*cur != 0) cur++; 192628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while ((*cur == 0) && (cur != endval)) cur++; 192728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 19286fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard /* TODO what return value ? c.f. bug #158628 192928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (ret != NULL) { 193028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard TODO 19316fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard } */ 19326fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard xmlFree(val); 1933a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard if (tmp == 0) 1934a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard return(nb_values); 1935a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard return(-1); 193628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard} 193728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard 193828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard/** 1939e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * xmlSchemaParseUInt: 1940e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @str: pointer to the string R/W 1941e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @llo: pointer to the low result 1942e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @lmi: pointer to the mid result 1943e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @lhi: pointer to the high result 1944e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * 1945e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * Parse an unsigned long into 3 fields. 1946e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * 1947ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack * Returns the number of significant digits in the number or 1948ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack * -1 if overflow of the capacity 1949e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard */ 1950e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardstatic int 1951e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel VeillardxmlSchemaParseUInt(const xmlChar **str, unsigned long *llo, 1952478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik unsigned long *lmi, unsigned long *lhi) { 1953e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard unsigned long lo = 0, mi = 0, hi = 0; 1954e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard const xmlChar *tmp, *cur = *str; 1955e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard int ret = 0, i = 0; 1956e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard 1957478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while (*cur == '0') { /* ignore leading zeroes */ 1958478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik cur++; 1959e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1960e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard tmp = cur; 1961e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while ((*tmp != 0) && (*tmp >= '0') && (*tmp <= '9')) { 1962478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik i++;tmp++;ret++; 1963e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1964e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (i > 24) { 1965478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *str = tmp; 1966478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik return(-1); 1967e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1968e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while (i > 16) { 1969478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik hi = hi * 10 + (*cur++ - '0'); 1970478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik i--; 1971e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1972e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while (i > 8) { 1973478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik mi = mi * 10 + (*cur++ - '0'); 1974478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik i--; 1975e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1976e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while (i > 0) { 1977478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik lo = lo * 10 + (*cur++ - '0'); 1978478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik i--; 1979e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1980e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard 1981e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *str = cur; 1982e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *llo = lo; 1983e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *lmi = mi; 1984e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *lhi = hi; 1985e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return(ret); 1986e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard} 1987e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard 1988e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard/** 1989b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaValAtomicType: 19904255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @type: the predefined type 19914255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value: the value to check 19924255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @val: the return computed value 1993c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @node: the node containing the value 1994b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * flags: flags to control the vlidation 19954255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 1996b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check that a value conforms to the lexical space of the atomic type. 19974255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * if true a value is computed and returned in @val. 199801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * This checks the value space for list types as well (IDREFS, NMTOKENS). 19994255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 20004255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 20014255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * and -1 in case of internal or API error. 20024255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 2003b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic int 20041ac24d36b12487995b659a8fc23a02b9460edb36Daniel VeillardxmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value, 20054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaValPtr * val, xmlNodePtr node, int flags, 20064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaWhitespaceValueType ws, 20074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik int normOnTheFly, int applyNorm, int createStringValue) 20081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard{ 20094255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaValPtr v; 2010b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlChar *norm = NULL; 2011d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard int ret = 0; 20124255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 20134255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (xmlSchemaTypesInitialized == 0) 201401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitTypes(); 20154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (type == NULL) 20161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (-1); 20175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 2018eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard /* 2019eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard * validating a non existant text node is similar to validating 2020eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard * an empty one. 2021eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard */ 2022eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard if (value == NULL) 2023eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard value = BAD_CAST ""; 2024eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard 20254255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (val != NULL) 20261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = NULL; 2027b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((flags == 0) && (value != NULL)) { 202891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik 202901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if ((type->builtInType != XML_SCHEMAS_STRING) && 203091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik (type->builtInType != XML_SCHEMAS_ANYTYPE) && 203191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik (type->builtInType != XML_SCHEMAS_ANYSIMPLETYPE)) { 203291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik if (type->builtInType == XML_SCHEMAS_NORMSTRING) 203391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik norm = xmlSchemaWhiteSpaceReplace(value); 203491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik else 203591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik norm = xmlSchemaCollapseString(value); 20361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 20371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard value = norm; 20381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2039b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 2040b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 204101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard switch (type->builtInType) { 20422f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack case XML_SCHEMAS_UNKNOWN: 20431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 20442f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack case XML_SCHEMAS_ANYTYPE: 20452f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack case XML_SCHEMAS_ANYSIMPLETYPE: 20464efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((createStringValue) && (val != NULL)) { 20474efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik v = xmlSchemaNewValue(XML_SCHEMAS_ANYSIMPLETYPE); 20484efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (v != NULL) { 20494efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik v->value.str = xmlStrdup(value); 20504efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik *val = v; 20514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 20524efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto error; 20534efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 20544efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 20552f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack goto return0; 20564efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_STRING: 20574efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (! normOnTheFly) { 20584efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik const xmlChar *cur = value; 20594efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 20604efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_REPLACE) { 20614efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while (*cur != 0) { 20624efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { 20634efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 20644efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 20654efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 20664efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 20674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 20684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) { 20694efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while (*cur != 0) { 20704efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { 20714efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 20724efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else if IS_WSP_SPACE_CH(*cur) { 20734efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 20744efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if IS_WSP_SPACE_CH(*cur) 20754efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 20764efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 20774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 20784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 20794efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 20804efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 20814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 20824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (createStringValue && (val != NULL)) { 20834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (applyNorm) { 20844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) 20854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik norm = xmlSchemaCollapseString(value); 20864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik else if (ws == XML_SCHEMA_WHITESPACE_REPLACE) 20874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik norm = xmlSchemaWhiteSpaceReplace(value); 20884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (norm != NULL) 20894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik value = norm; 20904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 20914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik v = xmlSchemaNewValue(XML_SCHEMAS_STRING); 20924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (v != NULL) { 20934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik v->value.str = xmlStrdup(value); 20944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik *val = v; 20954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 20964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto error; 20974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 20984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 20991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 21001516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard case XML_SCHEMAS_NORMSTRING:{ 21014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) { 21024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (applyNorm) { 21034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) 21044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik norm = xmlSchemaCollapseString(value); 21054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik else 21064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik norm = xmlSchemaWhiteSpaceReplace(value); 21074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (norm != NULL) 21084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik value = norm; 21094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 21104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 21114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik const xmlChar *cur = value; 21124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while (*cur != 0) { 21134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { 21144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 21154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 21164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 21174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 21184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 21194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 21201516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard if (val != NULL) { 21211516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NORMSTRING); 21221516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard if (v != NULL) { 21231516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard v->value.str = xmlStrdup(value); 21241516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard *val = v; 21251516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } else { 21261516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard goto error; 21271516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } 21281516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } 21291516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard goto return0; 21301516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } 21311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_DECIMAL:{ 2132273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack const xmlChar *cur = value; 2133273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack unsigned int len, neg = 0; 2134273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack xmlChar cval[25]; 2135273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack xmlChar *cptr = cval; 2136273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack int dec = -1; 21371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 21381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 21391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 21404efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 21414efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 21424efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 21434efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 2144273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* First we handle an optional sign */ 21451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '+') 21461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 21471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (*cur == '-') { 21481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard neg = 1; 21491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 21501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2151273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 2152273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * Next we "pre-parse" the number, in preparation for calling 2153273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * the common routine xmlSchemaParseUInt. We get rid of any 2154273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * leading zeroes (because we have reserved only 25 chars), 2155273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * and note the position of any decimal point. 2156273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 2157273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack len = 0; 2158c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 2159c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Skip leading zeroes. 2160c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 2161c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik while (*cur == '0') 2162273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack cur++; 2163c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (*cur != 0) { 2164c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik while (len < 24) { 2165c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((*cur >= '0') && (*cur <= '9')) { 2166c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *cptr++ = *cur++; 2167c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik len++; 2168c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else if (*cur == '.') { 2169c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec != -1) 2170c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik goto return1; /* multiple decimal points */ 2171c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik cur++; 2172c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((*cur == 0) && (cur -1 == value)) 2173c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik goto return1; 2174c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 2175c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik dec = len; 2176c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik while ((len < 24) && (*cur >= '0') && 2177c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik (*cur <= '9')) { 2178c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *cptr++ = *cur++; 2179c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik len++; 2180c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 2181c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 2182c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else 2183c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 2184c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 2185273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 21864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 21874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 2188273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack if (*cur != 0) 2189273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack goto return1; /* error if any extraneous chars */ 21901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 21911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL); 21921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 2193273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 2194273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * If a mixed decimal, get rid of trailing zeroes 2195273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 21966c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (dec != -1) { 2197273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack while ((cptr > cval) && (*(cptr-1) == '0')) { 2198273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack cptr--; 2199273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack len--; 2200273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 2201273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 2202273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack *cptr = 0; /* Terminate our (preparsed) string */ 2203273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack cptr = cval; 2204273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 2205273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * Now evaluate the significant digits of the number 2206273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 2207c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (*cptr != 0) 2208c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaParseUInt((const xmlChar **)&cptr, 2209273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack &v->value.decimal.lo, 2210273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack &v->value.decimal.mi, 2211273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack &v->value.decimal.hi); 2212c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 2213c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Set the total digits to 1 if a zero value. 2214c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 2215c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (len == 0) 2216c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik len++; 22171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.sign = neg; 2218273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack if (dec == -1) { 2219273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack v->value.decimal.frac = 0; 2220273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack v->value.decimal.total = len; 2221273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } else { 2222c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik v->value.decimal.frac = len - dec; 2223c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik v->value.decimal.total = len; 2224273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 22251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 22261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 22291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2230b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_TIME: 2231b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GDAY: 2232b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GMONTH: 2233b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GMONTHDAY: 2234b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GYEAR: 2235b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GYEARMONTH: 2236b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_DATE: 2237b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_DATETIME: 22384efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = xmlSchemaValidateDates(type->builtInType, value, val, 22394efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik normOnTheFly); 22401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard break; 2241b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_DURATION: 22424efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = xmlSchemaValidateDuration(type, value, val, 22434efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik normOnTheFly); 22441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard break; 2245b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_FLOAT: 22461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_DOUBLE:{ 22471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 22481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int neg = 0; 22491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 22501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 22511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 22524efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 22534efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 22544efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 22554efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 22561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((cur[0] == 'N') && (cur[1] == 'a') && (cur[2] == 'N')) { 22571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur += 3; 22581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 22591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 22601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 22611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (type == xmlSchemaTypeFloatDef) { 22621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT); 22631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 22641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.f = (float) xmlXPathNAN; 22651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 22661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 22671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 22681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 22701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE); 22711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 22721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.d = xmlXPathNAN; 22731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 22741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 22751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 22761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 22791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 22811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '-') { 22831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard neg = 1; 22841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 22851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((cur[0] == 'I') && (cur[1] == 'N') && (cur[2] == 'F')) { 22871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur += 3; 22881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 22891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 22901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 22911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (type == xmlSchemaTypeFloatDef) { 22921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT); 22931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 22941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (neg) 22951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.f = (float) xmlXPathNINF; 22961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 22971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.f = (float) xmlXPathPINF; 22981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 22991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 23001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 23011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 23031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE); 23041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 23051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (neg) 23061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.d = xmlXPathNINF; 23071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 23081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.d = xmlXPathPINF; 23091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 23101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 23111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 23121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 23151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 23171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((neg == 0) && (*cur == '+')) 23191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 23201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((cur[0] == 0) || (cur[0] == '+') || (cur[0] == '-')) 23211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 23221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { 23231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 23241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '.') { 23261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 23271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) 23281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 23291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((*cur == 'e') || (*cur == 'E')) { 23311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 23321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((*cur == '-') || (*cur == '+')) 23331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 23341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) 23351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 23361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 23384efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 23394efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 23401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 23411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 23421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 23431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (type == xmlSchemaTypeFloatDef) { 23441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT); 23451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 23466c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik /* 23476c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * TODO: sscanf seems not to give the correct 23486c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * value for extremely high/low values. 23496c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * E.g. "1E-149" results in zero. 23506c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */ 2351d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard if (sscanf((const char *) value, "%f", 23521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard &(v->value.f)) == 1) { 23536c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *val = v; 23541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 23551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 23561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 23571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 23591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 23601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 23621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE); 23631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 23646c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik /* 23656c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * TODO: sscanf seems not to give the correct 23666c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * value for extremely high/low values. 23676c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */ 2368d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard if (sscanf((const char *) value, "%lf", 23691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard &(v->value.d)) == 1) { 23701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 23711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 23721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 23731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 23741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 23761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 23771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 23811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_BOOLEAN:{ 23831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 23841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 23854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) { 23864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 23874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (*cur == '0') { 23884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 0; 23894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 23904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else if (*cur == '1') { 23914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 1; 23924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 23934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else if (*cur == 't') { 23944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 23954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((*cur++ == 'r') && (*cur++ == 'u') && 23964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik (*cur++ == 'e')) { 23974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 1; 23984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else 23994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 24004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else if (*cur == 'f') { 24014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 24024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((*cur++ == 'a') && (*cur++ == 'l') && 24034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik (*cur++ == 's') && (*cur++ == 'e')) { 24044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 0; 24054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else 24064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 24074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 24084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (*cur != 0) { 24094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 24104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (*cur != 0) 24114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 24124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 24134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 24144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((cur[0] == '0') && (cur[1] == 0)) 24154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 0; 24164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik else if ((cur[0] == '1') && (cur[1] == 0)) 24174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 1; 24184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik else if ((cur[0] == 't') && (cur[1] == 'r') 24194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik && (cur[2] == 'u') && (cur[3] == 'e') 24204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik && (cur[4] == 0)) 24214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 1; 24224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik else if ((cur[0] == 'f') && (cur[1] == 'a') 24234efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik && (cur[2] == 'l') && (cur[3] == 's') 24244efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik && (cur[4] == 'e') && (cur[5] == 0)) 24254efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 0; 24264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik else 24274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 24284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 24291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 24301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_BOOLEAN); 24311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 24321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.b = ret; 24331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 24341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 24351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 24361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 24391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_TOKEN:{ 24411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 24421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 24434efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (! normOnTheFly) { 24444efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while (*cur != 0) { 24454efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { 24464efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 24474efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else if (*cur == ' ') { 24484efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 24494efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (*cur == 0) 24504efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 24514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (*cur == ' ') 24524efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 24534efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 24544efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 24554efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 24564efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 24574efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 24581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 24591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_TOKEN); 24601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 24611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 24621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 24631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 24641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 24651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 24681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2469b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_LANGUAGE: 24704efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) { 24714efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik norm = xmlSchemaCollapseString(value); 24724efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (norm != NULL) 24734efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik value = norm; 24744efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 24751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (xmlCheckLanguageID(value) == 1) { 24761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 24771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_LANGUAGE); 24781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 24791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 24801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 24811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 24821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 24831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 24861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 2488b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_NMTOKEN: 24891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (xmlValidateNMToken(value, 1) == 0) { 24901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 24911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NMTOKEN); 24921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 24931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 24941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 24951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 24961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 24971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 25001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 2502b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_NMTOKENS: 25031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlSchemaValAtomicListNode(xmlSchemaTypeNmtokenDef, 25041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard value, val, node); 25051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret > 0) 25061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 25071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 25081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 25091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2510b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_NAME: 25111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateName(value, 1); 2512df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard if ((ret == 0) && (val != NULL) && (value != NULL)) { 2513df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NAME); 2514df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard if (v != NULL) { 2515df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard const xmlChar *start = value, *end; 2516df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard while (IS_BLANK_CH(*start)) start++; 2517df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard end = start; 2518df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard while ((*end != 0) && (!IS_BLANK_CH(*end))) end++; 2519df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard v->value.str = xmlStrndup(start, end - start); 2520df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard *val = v; 2521df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard } else { 2522df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard goto error; 2523df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard } 25241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 25261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_QNAME:{ 25271c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik const xmlChar *uri = NULL; 25281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *local = NULL; 25291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 25301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateQName(value, 1); 25311c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (ret != 0) 25321c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik goto done; 25331c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (node != NULL) { 25341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *prefix; 25351c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik xmlNsPtr ns; 25361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 25371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard local = xmlSplitQName2(value, &prefix); 25381c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik ns = xmlSearchNs(node->doc, node, prefix); 25391c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if ((ns == NULL) && (prefix != NULL)) { 25401c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik xmlFree(prefix); 25411c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (local != NULL) 25421c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik xmlFree(local); 25431c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik goto return1; 25441c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik } 25451c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (ns != NULL) 25461c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik uri = ns->href; 25471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (prefix != NULL) 25481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(prefix); 25491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25501c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (val != NULL) { 25511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_QNAME); 25521c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (v == NULL) { 25531c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (local != NULL) 25541c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik xmlFree(local); 25551c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik goto error; 25561c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik } 25571c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (local != NULL) 25581c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik v->value.qname.name = local; 25591c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik else 25601c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik v->value.qname.name = xmlStrdup(value); 25611c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (uri != NULL) 25621c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik v->value.qname.uri = xmlStrdup(uri); 25631c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik *val = v; 25641c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik } else 25651c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (local != NULL) 25661c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik xmlFree(local); 25671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 25681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2569b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_NCNAME: 25701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNCName(value, 1); 25711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 25721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NCNAME); 25731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 25741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 25751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 25761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 25771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 25781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2581b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_ID: 25821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNCName(value, 1); 25831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 25841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_ID); 25851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 25861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 25871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 25881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 25891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 25901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 25931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 25941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 25951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 25961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 25971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * NOTE: the IDness might have already be declared in the DTD 25981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard */ 25991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (attr->atype != XML_ATTRIBUTE_ID) { 26001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlIDPtr res; 26011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *strip; 26021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 26031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard strip = xmlSchemaStrip(value); 26041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (strip != NULL) { 26051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard res = xmlAddID(NULL, node->doc, strip, attr); 26061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(strip); 26071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else 26081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard res = xmlAddID(NULL, node->doc, value, attr); 26091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (res == NULL) { 26101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 2; 26111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 26121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_ID; 26131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2617b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_IDREF: 26181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNCName(value, 1); 26191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 26206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik v = xmlSchemaNewValue(XML_SCHEMAS_IDREF); 26216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (v == NULL) 26226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik goto error; 26236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik v->value.str = xmlStrdup(value); 26246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *val = v; 26251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 26271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 26281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 26291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *strip; 26301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 26311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard strip = xmlSchemaStrip(value); 26321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (strip != NULL) { 26331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAddRef(NULL, node->doc, strip, attr); 26341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(strip); 26351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else 26361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAddRef(NULL, node->doc, value, attr); 26371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_IDREF; 26381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2640b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_IDREFS: 26411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlSchemaValAtomicListNode(xmlSchemaTypeIdrefDef, 26421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard value, val, node); 26431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret < 0) 26441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 2; 26451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 26461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 26471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 26481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 26491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 2650249d7bbee28570177a8573a99eab4aa9e27384d9Daniel Veillard 26511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_IDREFS; 26521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 26541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_ENTITY:{ 26551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *strip; 26561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 26571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNCName(value, 1); 26581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((node == NULL) || (node->doc == NULL)) 26591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 3; 26601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret == 0) { 26611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlEntityPtr ent; 26621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 26631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard strip = xmlSchemaStrip(value); 26641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (strip != NULL) { 26651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ent = xmlGetDocEntity(node->doc, strip); 26661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(strip); 26671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 26681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ent = xmlGetDocEntity(node->doc, value); 26691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ent == NULL) || 26711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (ent->etype != 26721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard XML_EXTERNAL_GENERAL_UNPARSED_ENTITY)) 26731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 4; 26741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 26761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard TODO; 26771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 26791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 26801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 2681a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard 26821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_ENTITY; 26831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 26851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2686b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_ENTITIES: 26871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((node == NULL) || (node->doc == NULL)) 26881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return3; 26891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlSchemaValAtomicListNode(xmlSchemaTypeEntityDef, 26901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard value, val, node); 26911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret <= 0) 26921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 26931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 26941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 26951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 26961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 26971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 26981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 26991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_ENTITIES; 27001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 27021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_NOTATION:{ 27031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *uri = NULL; 27041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *local = NULL; 27051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 27061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateQName(value, 1); 27071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL)) { 27081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *prefix; 27091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 27101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard local = xmlSplitQName2(value, &prefix); 27111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (prefix != NULL) { 27121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlNsPtr ns; 27131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 27141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ns = xmlSearchNs(node->doc, node, prefix); 27151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ns == NULL) 27161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 27171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (val != NULL) 27181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard uri = xmlStrdup(ns->href); 27191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((local != NULL) && ((val == NULL) || (ret != 0))) 27211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(local); 27221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (prefix != NULL) 27231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(prefix); 27241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((node == NULL) || (node->doc == NULL)) 27261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 3; 27271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret == 0) { 27281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNotationUse(NULL, node->doc, value); 27291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret == 1) 27301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 27311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 27321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 27331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 27351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NOTATION); 27361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 27371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (local != NULL) 27381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.qname.name = local; 27391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 27401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.qname.name = xmlStrdup(value); 27411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (uri != NULL) 27421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.qname.uri = uri; 27431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 27441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 27451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 27461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (local != NULL) 27471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(local); 27481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (uri != NULL) 27491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(uri); 27501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 27511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2754560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } 27554efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYURI:{ 275611c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard if (*value != 0) { 27574efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlURIPtr uri; 27584efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) { 27594efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik norm = xmlSchemaCollapseString(value); 27604efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (norm != NULL) 27614efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik value = norm; 27624efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 27634efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik uri = xmlParseURI((const char *) value); 276411c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard if (uri == NULL) 276511c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard goto return1; 276611c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard xmlFreeURI(uri); 276711c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard } 2768560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 27691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 277011c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_ANYURI); 277111c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard if (v == NULL) 277211c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard goto error; 277311c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard v->value.str = xmlStrdup(value); 277411c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard *val = v; 27751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 27771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_HEXBINARY:{ 27798dd1e1bcad796ea4cc9ad8a76eb44868e6e0d329Kasimier T. Buchcik const xmlChar *cur = value, *start; 27801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *base; 27811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int total, i = 0; 2782560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 2783f34a20e69dc675cd23d3eb558cad135ea280f472Daniel Veillard if (cur == NULL) 27841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 2785560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 27864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 27874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 27884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 27898dd1e1bcad796ea4cc9ad8a76eb44868e6e0d329Kasimier T. Buchcik start = cur; 27901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while (((*cur >= '0') && (*cur <= '9')) || 27911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ((*cur >= 'A') && (*cur <= 'F')) || 27921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ((*cur >= 'a') && (*cur <= 'f'))) { 27931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard i++; 27941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 27951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 27974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 2798560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 27991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 28001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 28011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((i % 2) != 0) 280270bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard goto return1; 2803560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 28041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 28051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 28061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_HEXBINARY); 28071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v == NULL) 28081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 28094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik /* 28104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Copy only the normalized piece. 28114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * CRITICAL TODO: Check this. 28124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik */ 28138dd1e1bcad796ea4cc9ad8a76eb44868e6e0d329Kasimier T. Buchcik cur = xmlStrndup(start, i); 28141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) { 2815d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard xmlSchemaTypeErrMemory(node, "allocating hexbin data"); 28161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(v); 28171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 28181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 28201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard total = i / 2; /* number of octets */ 282170bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard 28221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard base = (xmlChar *) cur; 28231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while (i-- > 0) { 28241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*base >= 'a') 28251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *base = *base - ('a' - 'A'); 28261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard base++; 28271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 282870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard 28291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.hex.str = (xmlChar *) cur; 28301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.hex.total = total; 28311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 28321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 28341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_BASE64BINARY:{ 28361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* ISSUE: 28371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 28381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Ignore all stray characters? (yes, currently) 28391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Worry about long lines? (no, currently) 28401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 28411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * rfc2045.txt: 28421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 28431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * "The encoded output stream must be represented in lines of 28441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * no more than 76 characters each. All line breaks or other 28451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * characters not found in Table 1 must be ignored by decoding 28461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * software. In base64 data, characters other than those in 28471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Table 1, line breaks, and other white space probably 28481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * indicate a transmission error, about which a warning 28491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * message or even a message rejection might be appropriate 28501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * under some circumstances." */ 28511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 28521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *base; 28531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int total, i = 0, pad = 0; 28541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 28551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 28561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 28571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 28581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (; *cur; ++cur) { 28591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int decc; 28601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 28611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard decc = _xmlSchemaBase64Decode(*cur); 28621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc < 0) ; 28631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (decc < 64) 28641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard i++; 28651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 28661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard break; 28671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (; *cur; ++cur) { 28691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int decc; 28701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 28711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard decc = _xmlSchemaBase64Decode(*cur); 28721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc < 0) ; 28731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (decc < 64) 28741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 28751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc == 64) 28761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard pad++; 28771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 28791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* rfc2045.txt: "Special processing is performed if fewer than 28801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 24 bits are available at the end of the data being encoded. 28811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * A full encoding quantum is always completed at the end of a 28821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * body. When fewer than 24 input bits are available in an 28831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * input group, zero bits are added (on the right) to form an 28841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * integral number of 6-bit groups. Padding at the end of the 28851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * data is performed using the "=" character. Since all 28861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * base64 input is an integral number of octets, only the 28871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * following cases can arise: (1) the final quantum of 28881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * encoding input is an integral multiple of 24 bits; here, 28891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * the final unit of encoded output will be an integral 28901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * multiple ofindent: Standard input:701: Warning:old style 28911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * assignment ambiguity in "=*". Assuming "= *" 4 characters 28921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * with no "=" padding, (2) the final 28931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * quantum of encoding input is exactly 8 bits; here, the 28941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * final unit of encoded output will be two characters 28951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * followed by two "=" padding characters, or (3) the final 28961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * quantum of encoding input is exactly 16 bits; here, the 28971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * final unit of encoded output will be three characters 28981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * followed by one "=" padding character." */ 28991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 29001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard total = 3 * (i / 4); 29011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (pad == 0) { 29021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (i % 4 != 0) 29031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 29041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else if (pad == 1) { 29051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int decc; 29061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 29071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (i % 4 != 3) 29081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 29091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (decc = _xmlSchemaBase64Decode(*cur); 29101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (decc < 0) || (decc > 63); 29111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard decc = _xmlSchemaBase64Decode(*cur)) 29121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard --cur; 29131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 16bits in 24bits means 2 pad bits: nnnnnn nnmmmm mmmm00*/ 29141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 00111100 -> 0x3c */ 29151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc & ~0x3c) 29161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 29171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard total += 2; 29181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else if (pad == 2) { 29191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int decc; 29201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 29211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (i % 4 != 2) 29221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 29231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (decc = _xmlSchemaBase64Decode(*cur); 29241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (decc < 0) || (decc > 63); 29251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard decc = _xmlSchemaBase64Decode(*cur)) 29261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard --cur; 29271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 8bits in 12bits means 4 pad bits: nnnnnn nn0000 */ 29281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 00110000 -> 0x30 */ 29291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc & ~0x30) 29301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 29311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard total += 1; 29321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else 29331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 29341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 29351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 29361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_BASE64BINARY); 29371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v == NULL) 29381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 29391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard base = 29401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (xmlChar *) xmlMallocAtomic((i + pad + 1) * 29411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard sizeof(xmlChar)); 29421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (base == NULL) { 2943d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard xmlSchemaTypeErrMemory(node, "allocating base64 data"); 29441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(v); 29451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 29461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 29471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.base64.str = base; 29481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (cur = value; *cur; ++cur) 29491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (_xmlSchemaBase64Decode(*cur) >= 0) { 29501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *base = *cur; 29511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ++base; 29521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 29531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *base = 0; 29541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.base64.total = total; 29551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 29561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 29571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 295870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard } 2959e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_INTEGER: 2960e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_PINTEGER: 2961e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_NPINTEGER: 2962e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_NINTEGER: 29631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_NNINTEGER:{ 29641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 29651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard unsigned long lo, mi, hi; 2966ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack int sign = 0; 29671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 29681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 29691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 29704efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 29714efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 29721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '-') { 29731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard sign = 1; 29741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 29751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else if (*cur == '+') 29761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 2977ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); 2978ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack if (ret == -1) 2979ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack goto return1; 29804efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 29814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 2982ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack if (*cur != 0) 2983ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack goto return1; 298401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (type->builtInType == XML_SCHEMAS_NPINTEGER) { 29851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && 29861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ((hi != 0) || (mi != 0) || (lo != 0))) 29871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 298801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_PINTEGER) { 29891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (sign == 1) 29901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 29911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((hi == 0) && (mi == 0) && (lo == 0)) 29921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 299301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_NINTEGER) { 29941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (sign == 0) 29951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 29961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((hi == 0) && (mi == 0) && (lo == 0)) 29971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 299801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_NNINTEGER) { 29991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && 30001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ((hi != 0) || (mi != 0) || (lo != 0))) 30011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 30036c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (val != NULL) { 300401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard v = xmlSchemaNewValue(type->builtInType); 30051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 3006c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (ret == 0) 3007c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik ret++; 30081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.lo = lo; 30096c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik v->value.decimal.mi = mi; 30106c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik v->value.decimal.hi = hi; 30111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.sign = sign; 30121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.frac = 0; 3013ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack v->value.decimal.total = ret; 30141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 30151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 30161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 30171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 30181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 3019e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_LONG: 3020e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_BYTE: 3021e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_SHORT: 30221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_INT:{ 3023478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *cur = value; 30241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard unsigned long lo, mi, hi; 30251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int sign = 0; 30261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 30271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 30281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '-') { 30301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard sign = 1; 30311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 30321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else if (*cur == '+') 30331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 3034ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); 3035ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack if (ret < 0) 3036ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack goto return1; 3037ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack if (*cur != 0) 3038ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack goto return1; 303901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (type->builtInType == XML_SCHEMAS_LONG) { 30401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi >= 922) { 30411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi > 922) 30421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi >= 33720368) { 30441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi > 33720368) 30451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && (lo > 54775807)) 30471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && (lo > 54775808)) 30491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 30511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 305201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_INT) { 30531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi != 0) 30541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi >= 21) { 30561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi > 21) 30571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && (lo > 47483647)) 30591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && (lo > 47483648)) 30611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 306301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_SHORT) { 30641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((mi != 0) || (hi != 0)) 30651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && (lo > 32768)) 30671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && (lo > 32767)) 30691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 307001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_BYTE) { 30711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((mi != 0) || (hi != 0)) 30721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && (lo > 128)) 30741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && (lo > 127)) 30761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 30781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 307901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard v = xmlSchemaNewValue(type->builtInType); 30801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 30811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.lo = lo; 30826c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik v->value.decimal.mi = mi; 30836c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik v->value.decimal.hi = hi; 30841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.sign = sign; 30851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.frac = 0; 3086ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack v->value.decimal.total = ret; 30871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 30881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 30891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 30901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 30911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 3092e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_UINT: 3093e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_ULONG: 3094e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_USHORT: 30951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_UBYTE:{ 30961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 30971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard unsigned long lo, mi, hi; 30981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 30991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 31001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 3101ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); 3102ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack if (ret < 0) 3103ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack goto return1; 3104ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack if (*cur != 0) 3105ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack goto return1; 310601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (type->builtInType == XML_SCHEMAS_ULONG) { 31071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi >= 1844) { 31081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi > 1844) 31091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi >= 67440737) { 31111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi > 67440737) 31121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (lo > 9551615) 31141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 31161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 311701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_UINT) { 31181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi != 0) 31191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi >= 42) { 31211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi > 42) 31221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (lo > 94967295) 31241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 312601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_USHORT) { 31271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((mi != 0) || (hi != 0)) 31281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (lo > 65535) 31301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 313101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_UBYTE) { 31321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((mi != 0) || (hi != 0)) 31331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (lo > 255) 31351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 31371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 313801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard v = xmlSchemaNewValue(type->builtInType); 31391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 31401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.lo = lo; 31411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.mi = mi; 31421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.hi = hi; 31431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.sign = 0; 31441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.frac = 0; 3145ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack v->value.decimal.total = ret; 31461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 31471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 31481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 31491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 31501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 31514255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 3152b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 31531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard done: 31541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 31551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 31561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (ret); 31571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return3: 31581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 31591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 31601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (3); 31611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return1: 31621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 31631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 31641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (1); 31651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return0: 31661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 31671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 31681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (0); 31691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard error: 31701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 31711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 31721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (-1); 3173b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard} 3174b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 3175b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/** 3176b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaValPredefTypeNode: 3177b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @type: the predefined type 3178b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @value: the value to check 3179b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @val: the return computed value 3180b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @node: the node containing the value 3181b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 3182b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check that a value conforms to the lexical space of the predefined type. 3183b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * if true a value is computed and returned in @val. 3184b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 3185b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns 0 if this validates, a positive error code number otherwise 3186b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * and -1 in case of internal or API error. 3187b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 3188b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardint 3189b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaValPredefTypeNode(xmlSchemaTypePtr type, const xmlChar *value, 3190b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlSchemaValPtr *val, xmlNodePtr node) { 31914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return(xmlSchemaValAtomicType(type, value, val, node, 0, 31924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik XML_SCHEMA_WHITESPACE_UNKNOWN, 1, 1, 0)); 31934255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 31944255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 31954255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 3196c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * xmlSchemaValPredefTypeNodeNoNorm: 3197c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @type: the predefined type 3198c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @value: the value to check 3199c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @val: the return computed value 3200c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @node: the node containing the value 3201c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * 3202c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Check that a value conforms to the lexical space of the predefined type. 3203c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * if true a value is computed and returned in @val. 3204c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * This one does apply any normalization to the value. 3205c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * 3206c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 3207c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * and -1 in case of internal or API error. 3208c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */ 3209c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardint 3210c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaValPredefTypeNodeNoNorm(xmlSchemaTypePtr type, const xmlChar *value, 3211c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard xmlSchemaValPtr *val, xmlNodePtr node) { 32124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return(xmlSchemaValAtomicType(type, value, val, node, 1, 32134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik XML_SCHEMA_WHITESPACE_UNKNOWN, 1, 0, 1)); 3214c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard} 3215c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 3216c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard/** 3217c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * xmlSchemaValidatePredefinedType: 3218c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @type: the predefined type 3219c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @value: the value to check 3220c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @val: the return computed value 3221c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * 3222c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * Check that a value conforms to the lexical space of the predefined type. 3223c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * if true a value is computed and returned in @val. 3224c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * 3225c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 3226c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * and -1 in case of internal or API error. 3227c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard */ 3228c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillardint 3229c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel VeillardxmlSchemaValidatePredefinedType(xmlSchemaTypePtr type, const xmlChar *value, 3230c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard xmlSchemaValPtr *val) { 3231c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard return(xmlSchemaValPredefTypeNode(type, value, val, NULL)); 3232c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard} 3233c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard 3234c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard/** 32354255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCompareDecimals: 32364255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @x: a first decimal value 32374255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @y: a second decimal value 32384255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 32394255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Compare 2 decimals 32404255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 32414255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y and -2 in case of error 32424255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 32434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic int 32444255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaCompareDecimals(xmlSchemaValPtr x, xmlSchemaValPtr y) 32454255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard{ 32464255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaValPtr swp; 3247273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack int order = 1, integx, integy, dlen; 3248273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack unsigned long hi, mi, lo; 32494255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 3250273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 3251273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * First test: If x is -ve and not zero 3252273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 3253e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((x->value.decimal.sign) && 3254e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((x->value.decimal.lo != 0) || 3255e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (x->value.decimal.mi != 0) || 3256e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (x->value.decimal.hi != 0))) { 3257273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 3258273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * Then if y is -ve and not zero reverse the compare 3259273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 3260e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((y->value.decimal.sign) && 3261e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((y->value.decimal.lo != 0) || 3262e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (y->value.decimal.mi != 0) || 3263e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (y->value.decimal.hi != 0))) 326480b19092f24410a6b869abf519227686e8f207caDaniel Veillard order = -1; 3265273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 3266273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * Otherwise (y >= 0) we have the answer 3267273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 326880b19092f24410a6b869abf519227686e8f207caDaniel Veillard else 326980b19092f24410a6b869abf519227686e8f207caDaniel Veillard return (-1); 3270273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 3271273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * If x is not -ve and y is -ve we have the answer 3272273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 3273e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } else if ((y->value.decimal.sign) && 3274e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((y->value.decimal.lo != 0) || 3275e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (y->value.decimal.mi != 0) || 3276e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (y->value.decimal.hi != 0))) { 32774255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return (1); 327880b19092f24410a6b869abf519227686e8f207caDaniel Veillard } 3279273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 3280273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * If it's not simply determined by a difference in sign, 3281273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * then we need to compare the actual values of the two nums. 3282273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * To do this, we start by looking at the integral parts. 3283273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * If the number of integral digits differ, then we have our 3284273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * answer. 3285273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 3286273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack integx = x->value.decimal.total - x->value.decimal.frac; 3287273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack integy = y->value.decimal.total - y->value.decimal.frac; 3288273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack if (integx > integy) 3289273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return order; 3290273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack else if (integy > integx) 3291273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return -order; 3292273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 3293273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * If the number of integral digits is the same for both numbers, 3294273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * then things get a little more complicated. We need to "normalize" 3295273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * the numbers in order to properly compare them. To do this, we 3296273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * look at the total length of each number (length => number of 3297273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * significant digits), and divide the "shorter" by 10 (decreasing 3298273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * the length) until they are of equal length. 3299273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 3300273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack dlen = x->value.decimal.total - y->value.decimal.total; 3301273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack if (dlen < 0) { /* y has more digits than x */ 3302273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack swp = x; 3303273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack hi = y->value.decimal.hi; 3304273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack mi = y->value.decimal.mi; 3305273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack lo = y->value.decimal.lo; 3306273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack dlen = -dlen; 3307273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack order = -order; 3308273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } else { /* x has more digits than y */ 3309273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack swp = y; 3310273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack hi = x->value.decimal.hi; 3311273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack mi = x->value.decimal.mi; 3312273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack lo = x->value.decimal.lo; 3313273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 3314273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack while (dlen > 8) { /* in effect, right shift by 10**8 */ 3315273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack lo = mi; 3316273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack mi = hi; 3317273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack hi = 0; 3318273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack dlen -= 8; 33194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 3320273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack while (dlen > 0) { 3321273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack unsigned long rem1, rem2; 3322273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack rem1 = (hi % 10) * 100000000L; 3323273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack hi = hi / 10; 3324273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack rem2 = (mi % 10) * 100000000L; 3325273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack mi = (mi + rem1) / 10; 3326273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack lo = (lo + rem2) / 10; 3327273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack dlen--; 3328273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 3329273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack if (hi > swp->value.decimal.hi) { 3330273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return order; 3331273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } else if (hi == swp->value.decimal.hi) { 3332273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack if (mi > swp->value.decimal.mi) { 3333273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return order; 3334273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } else if (mi == swp->value.decimal.mi) { 3335273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack if (lo > swp->value.decimal.lo) { 3336273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return order; 3337273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } else if (lo == swp->value.decimal.lo) { 3338273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack if (x->value.decimal.total == y->value.decimal.total) { 3339273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return 0; 3340273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } else { 3341273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return order; 3342273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 3343273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 3344273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 33454255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 3346273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return -order; 33474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 33484255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 33494255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 3350070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xmlSchemaCompareDurations: 3351070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @x: a first duration value 3352070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @y: a second duration value 3353070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 3354070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Compare 2 durations 3355070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 3356070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 3357070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * case of error 3358070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 3359070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 3360070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel VeillardxmlSchemaCompareDurations(xmlSchemaValPtr x, xmlSchemaValPtr y) 3361070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard{ 3362070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard long carry, mon, day; 3363070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard double sec; 336480b19092f24410a6b869abf519227686e8f207caDaniel Veillard int invert = 1; 336580b19092f24410a6b869abf519227686e8f207caDaniel Veillard long xmon, xday, myear, minday, maxday; 3366070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard static const long dayRange [2][12] = { 3367070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard { 0, 28, 59, 89, 120, 150, 181, 212, 242, 273, 303, 334, }, 3368070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard { 0, 31, 62, 92, 123, 153, 184, 215, 245, 276, 306, 337} }; 3369070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3370070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((x == NULL) || (y == NULL)) 33715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -2; 3372070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3373070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* months */ 3374070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard mon = x->value.dur.mon - y->value.dur.mon; 3375070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3376070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* seconds */ 3377070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard sec = x->value.dur.sec - y->value.dur.sec; 3378070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard carry = (long)sec / SECS_PER_DAY; 3379070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard sec -= (double)(carry * SECS_PER_DAY); 3380070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3381070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* days */ 3382070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard day = x->value.dur.day - y->value.dur.day + carry; 3383070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3384070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* easy test */ 3385070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (mon == 0) { 3386070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (day == 0) 3387070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (sec == 0.0) 3388070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 3389070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else if (sec < 0.0) 3390070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 3391070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else 3392070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 3393070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else if (day < 0) 3394070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 3395070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else 3396070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 3397070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 3398070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3399070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (mon > 0) { 3400070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((day >= 0) && (sec >= 0.0)) 3401070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 3402070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else { 3403070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmon = mon; 3404070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xday = -day; 3405070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 3406070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } else if ((day <= 0) && (sec <= 0.0)) { 3407070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 3408070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } else { 340980b19092f24410a6b869abf519227686e8f207caDaniel Veillard invert = -1; 3410070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmon = -mon; 3411070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xday = day; 3412070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 3413070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3414070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard myear = xmon / 12; 341580b19092f24410a6b869abf519227686e8f207caDaniel Veillard if (myear == 0) { 341680b19092f24410a6b869abf519227686e8f207caDaniel Veillard minday = 0; 341780b19092f24410a6b869abf519227686e8f207caDaniel Veillard maxday = 0; 341880b19092f24410a6b869abf519227686e8f207caDaniel Veillard } else { 341980b19092f24410a6b869abf519227686e8f207caDaniel Veillard maxday = 366 * ((myear + 3) / 4) + 342080b19092f24410a6b869abf519227686e8f207caDaniel Veillard 365 * ((myear - 1) % 4); 342180b19092f24410a6b869abf519227686e8f207caDaniel Veillard minday = maxday - 1; 342280b19092f24410a6b869abf519227686e8f207caDaniel Veillard } 342380b19092f24410a6b869abf519227686e8f207caDaniel Veillard 3424070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmon = xmon % 12; 3425070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard minday += dayRange[0][xmon]; 3426070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard maxday += dayRange[1][xmon]; 3427070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 342880b19092f24410a6b869abf519227686e8f207caDaniel Veillard if ((maxday == minday) && (maxday == xday)) 342980b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(0); /* can this really happen ? */ 3430070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (maxday < xday) 343180b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(-invert); 343280b19092f24410a6b869abf519227686e8f207caDaniel Veillard if (minday > xday) 343380b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(invert); 3434070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3435070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* indeterminate */ 34365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; 34375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard} 34385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 34395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/* 34405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * macros for adding date/times and durations 34415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 34425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define FQUOTIENT(a,b) (floor(((double)a/(double)b))) 34435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MODULO(a,b) (a - FQUOTIENT(a,b) * b) 34445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define FQUOTIENT_RANGE(a,low,high) (FQUOTIENT((a-low),(high-low))) 34455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MODULO_RANGE(a,low,high) ((MODULO((a-low),(high-low)))+low) 34465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 34475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 3448669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * xmlSchemaDupVal: 3449669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @v: the #xmlSchemaValPtr value to duplicate 3450669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * 3451669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Makes a copy of @v. The calling program is responsible for freeing 3452669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * the returned value. 3453669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * 3454669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * returns a pointer to a duplicated #xmlSchemaValPtr or NULL if error. 3455669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard */ 3456669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillardstatic xmlSchemaValPtr 3457669adfcd3af5dfda873b10119d44202a7450bb20Daniel VeillardxmlSchemaDupVal (xmlSchemaValPtr v) 3458669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard{ 3459669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard xmlSchemaValPtr ret = xmlSchemaNewValue(v->type); 3460669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard if (ret == NULL) 3461669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard return NULL; 3462669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard 3463669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard memcpy(ret, v, sizeof(xmlSchemaVal)); 34644efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret->next = NULL; 3465669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard return ret; 3466669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard} 3467669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard 3468669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard/** 3469285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * xmlSchemaCopyValue: 3470285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * @val: the precomputed value to be copied 3471285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * 3472285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * Copies the precomputed value. This duplicates any string within. 3473285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * 3474285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * Returns the copy or NULL if a copy for a data-type is not implemented. 3475285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik */ 3476285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. BuchcikxmlSchemaValPtr 3477285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. BuchcikxmlSchemaCopyValue(xmlSchemaValPtr val) 3478285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik{ 34794efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaValPtr ret = NULL, prev = NULL, cur; 3480285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik 3481285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik /* 3482285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * Copy the string values. 3483285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik */ 34844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while (val != NULL) { 34854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik switch (val->type) { 34864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYTYPE: 34874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_IDREFS: 34884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ENTITIES: 34894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NMTOKENS: 34904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaFreeValue(ret); 34914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (NULL); 34924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYSIMPLETYPE: 34934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_STRING: 34944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NORMSTRING: 34954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_TOKEN: 34964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_LANGUAGE: 34974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NAME: 34984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NCNAME: 34994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ID: 35004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_IDREF: 35014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ENTITY: 35024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NMTOKEN: 35034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYURI: 35044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur = xmlSchemaDupVal(val); 35054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (val->value.str != NULL) 35064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur->value.str = xmlStrdup(BAD_CAST val->value.str); 35074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 35084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_QNAME: 35094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NOTATION: 35104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur = xmlSchemaDupVal(val); 35114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (val->value.qname.name != NULL) 35124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur->value.qname.name = 3513285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik xmlStrdup(BAD_CAST val->value.qname.name); 35144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (val->value.qname.uri != NULL) 35154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur->value.qname.uri = 3516285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik xmlStrdup(BAD_CAST val->value.qname.uri); 35174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 35184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_HEXBINARY: 35194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur = xmlSchemaDupVal(val); 35204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (val->value.hex.str != NULL) 35214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur->value.hex.str = xmlStrdup(BAD_CAST val->value.hex.str); 35224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 35234efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_BASE64BINARY: 35244efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur = xmlSchemaDupVal(val); 35254efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (val->value.base64.str != NULL) 35264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur->value.base64.str = 3527285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik xmlStrdup(BAD_CAST val->value.base64.str); 35284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 35294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik default: 35304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur = xmlSchemaDupVal(val); 35314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 35324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 35334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (ret == NULL) 35344efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = cur; 35354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik else 35364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik prev->next = cur; 35374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik prev = cur; 35384efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik val = val->next; 3539285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik } 35404efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (ret); 3541285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik} 3542285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik 3543285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik/** 35445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * _xmlSchemaDateAdd: 35455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr 35465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dur: an #xmlSchemaValPtr of type #XS_DURATION 35475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 35485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Compute a new date/time from @dt and @dur. This function assumes @dt 35495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * is either #XML_SCHEMAS_DATETIME, #XML_SCHEMAS_DATE, #XML_SCHEMAS_GYEARMONTH, 3550669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * or #XML_SCHEMAS_GYEAR. The returned #xmlSchemaVal is the same type as 3551669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @dt. The calling program is responsible for freeing the returned value. 35525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 3553669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Returns a pointer to a new #xmlSchemaVal or NULL if error. 35545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 35555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr 35565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard_xmlSchemaDateAdd (xmlSchemaValPtr dt, xmlSchemaValPtr dur) 35575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{ 3558669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard xmlSchemaValPtr ret, tmp; 35595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard long carry, tempdays, temp; 35605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValDatePtr r, d; 35615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValDurationPtr u; 35625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 35635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((dt == NULL) || (dur == NULL)) 35645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 35655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 35665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret = xmlSchemaNewValue(dt->type); 35675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (ret == NULL) 35685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 35695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 3570669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard /* make a copy so we don't alter the original value */ 3571669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard tmp = xmlSchemaDupVal(dt); 3572669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard if (tmp == NULL) { 3573669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard xmlSchemaFreeValue(ret); 3574669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard return NULL; 3575669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard } 3576669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard 35775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r = &(ret->value.date); 3578669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard d = &(tmp->value.date); 35795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard u = &(dur->value.dur); 35805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 35815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalization */ 35825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (d->mon == 0) 35835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard d->mon = 1; 35845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 35855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize for time zone offset */ 35865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard u->sec -= (d->tzo * 60); 35875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard d->tzo = 0; 35885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 35895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalization */ 35905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (d->day == 0) 35915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard d->day = 1; 35925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 35935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* month */ 35945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry = d->mon + u->mon; 3595ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->mon = (unsigned int) MODULO_RANGE(carry, 1, 13); 3596ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard carry = (long) FQUOTIENT_RANGE(carry, 1, 13); 35975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 35985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* year (may be modified later) */ 35995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year = d->year + carry; 36005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (r->year == 0) { 36015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (d->year > 0) 36025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year--; 36035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 36045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year++; 36055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 36065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 36075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* time zone */ 36085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->tzo = d->tzo; 36095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->tz_flag = d->tz_flag; 36105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 36115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* seconds */ 36125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->sec = d->sec + u->sec; 3613ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard carry = (long) FQUOTIENT((long)r->sec, 60); 36145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (r->sec != 0.0) { 36155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->sec = MODULO(r->sec, 60.0); 36165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 36175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 36185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* minute */ 36195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry += d->min; 3620ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->min = (unsigned int) MODULO(carry, 60); 3621ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard carry = (long) FQUOTIENT(carry, 60); 36225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 36235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* hours */ 36245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry += d->hour; 3625ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->hour = (unsigned int) MODULO(carry, 24); 3626ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard carry = (long)FQUOTIENT(carry, 24); 36275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 36285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* 36295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * days 36305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Note we use tempdays because the temporary values may need more 36315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * than 5 bits 36325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 36335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((VALID_YEAR(r->year)) && (VALID_MONTH(r->mon)) && 36345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (d->day > MAX_DAYINMONTH(r->year, r->mon))) 36355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays = MAX_DAYINMONTH(r->year, r->mon); 36365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (d->day < 1) 36375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays = 1; 36385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 36395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays = d->day; 36405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 36415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays += u->day + carry; 36425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 36435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard while (1) { 36445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (tempdays < 1) { 3645ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard long tmon = (long) MODULO_RANGE(r->mon-1, 1, 13); 3646ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard long tyr = r->year + (long)FQUOTIENT_RANGE(r->mon-1, 1, 13); 36475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (tyr == 0) 36485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tyr--; 36495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays += MAX_DAYINMONTH(tyr, tmon); 36505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry = -1; 3651ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard } else if (tempdays > (long) MAX_DAYINMONTH(r->year, r->mon)) { 36525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays = tempdays - MAX_DAYINMONTH(r->year, r->mon); 36535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry = 1; 36545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } else 36555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 36565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 36575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard temp = r->mon + carry; 3658ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->mon = (unsigned int) MODULO_RANGE(temp, 1, 13); 3659ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->year = r->year + (unsigned int) FQUOTIENT_RANGE(temp, 1, 13); 36605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (r->year == 0) { 36615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (temp < 1) 36625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year--; 36635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 36645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year++; 36655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 36665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 36675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 36685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->day = tempdays; 36695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 36705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* 36715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * adjust the date/time type to the date values 36725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 36735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (ret->type != XML_SCHEMAS_DATETIME) { 36745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((r->hour) || (r->min) || (r->sec)) 36755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret->type = XML_SCHEMAS_DATETIME; 36765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (ret->type != XML_SCHEMAS_DATE) { 36775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((r->mon != 1) && (r->day != 1)) 36785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret->type = XML_SCHEMAS_DATE; 36795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if ((ret->type != XML_SCHEMAS_GYEARMONTH) && (r->mon != 1)) 36805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret->type = XML_SCHEMAS_GYEARMONTH; 36815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 36825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 36835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 3684669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard xmlSchemaFreeValue(tmp); 36855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 36865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return ret; 36875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard} 36885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 36895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 36905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaDateNormalize: 3691669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @dt: an #xmlSchemaValPtr of a date/time type value. 3692669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @offset: number of seconds to adjust @dt by. 36935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 3694669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Normalize @dt to GMT time. The @offset parameter is subtracted from 3695669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * the return value is a time-zone offset is present on @dt. 36965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 3697669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Returns a normalized copy of @dt or NULL if error. 36985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 36995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr 37005a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaDateNormalize (xmlSchemaValPtr dt, double offset) 37015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{ 37025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValPtr dur, ret; 37035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dt == NULL) 37055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 37065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (((dt->type != XML_SCHEMAS_TIME) && 3708c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik (dt->type != XML_SCHEMAS_DATETIME) && 3709c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik (dt->type != XML_SCHEMAS_DATE)) || (dt->value.date.tzo == 0)) 37105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return xmlSchemaDupVal(dt); 37115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION); 37135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dur == NULL) 37145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 37155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dur->value.date.sec -= offset; 37175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret = _xmlSchemaDateAdd(dt, dur); 37195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (ret == NULL) 37205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 37215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaFreeValue(dur); 37235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* ret->value.date.tzo = 0; */ 37255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return ret; 37265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard} 37275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 37295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * _xmlSchemaDateCastYMToDays: 37305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr 37315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 37325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Convert mon and year of @dt to total number of days. Take the 37335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * number of years since (or before) 1 AD and add the number of leap 37345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * years. This is a function because negative 37355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * years must be handled a little differently and there is no zero year. 37365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 37375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns number of days. 37385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 37395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic long 37405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard_xmlSchemaDateCastYMToDays (const xmlSchemaValPtr dt) 37415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{ 37425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard long ret; 374349e8963c640865343327c67d4755a1af705717d3Daniel Veillard int mon; 37445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 374549e8963c640865343327c67d4755a1af705717d3Daniel Veillard mon = dt->value.date.mon; 374649e8963c640865343327c67d4755a1af705717d3Daniel Veillard if (mon <= 0) mon = 1; /* normalization */ 374749e8963c640865343327c67d4755a1af705717d3Daniel Veillard 374849e8963c640865343327c67d4755a1af705717d3Daniel Veillard if (dt->value.date.year <= 0) 37495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret = (dt->value.date.year * 365) + 37505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (((dt->value.date.year+1)/4)-((dt->value.date.year+1)/100)+ 37515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ((dt->value.date.year+1)/400)) + 375249e8963c640865343327c67d4755a1af705717d3Daniel Veillard DAY_IN_YEAR(0, mon, dt->value.date.year); 37535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 37545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret = ((dt->value.date.year-1) * 365) + 37555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (((dt->value.date.year-1)/4)-((dt->value.date.year-1)/100)+ 37565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ((dt->value.date.year-1)/400)) + 375749e8963c640865343327c67d4755a1af705717d3Daniel Veillard DAY_IN_YEAR(0, mon, dt->value.date.year); 37585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return ret; 37605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard} 37615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 37635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * TIME_TO_NUMBER: 37645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr 37655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 37665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Calculates the number of seconds in the time portion of @dt. 37675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 37685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns seconds. 37695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 37705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define TIME_TO_NUMBER(dt) \ 37715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ((double)((dt->value.date.hour * SECS_PER_HOUR) + \ 3772b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard (dt->value.date.min * SECS_PER_MIN) + \ 3773b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard (dt->value.date.tzo * SECS_PER_MIN)) + \ 3774b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard dt->value.date.sec) 37755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 37775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaCompareDates: 37785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @x: a first date/time value 37795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @y: a second date/time value 37805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 37815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Compare 2 date/times 37825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 37835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 37845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * case of error 37855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 37865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic int 37875a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaCompareDates (xmlSchemaValPtr x, xmlSchemaValPtr y) 37885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{ 37895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard unsigned char xmask, ymask, xor_mask, and_mask; 37905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValPtr p1, p2, q1, q2; 37915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard long p1d, p2d, q1d, q2d; 37925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((x == NULL) || (y == NULL)) 37945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -2; 37955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.tz_flag) { 37975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (!y->value.date.tz_flag) { 37995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1 = xmlSchemaDateNormalize(x, 0); 38005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day; 38015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize y + 14:00 */ 38025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1 = xmlSchemaDateNormalize(y, (14 * SECS_PER_HOUR)); 38035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day; 3805fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (p1d < q1d) { 3806fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 3807fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 38085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 3809fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else if (p1d == q1d) { 38105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard double sec; 38115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1); 3813fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (sec < 0.0) { 3814fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 3815fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 38165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 3817fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 38184aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard int ret = 0; 38195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize y - 14:00 */ 38205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q2 = xmlSchemaDateNormalize(y, -(14 * SECS_PER_HOUR)); 38215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q2d = _xmlSchemaDateCastYMToDays(q2) + q2->value.date.day; 38225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (p1d > q2d) 38234aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 38245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (p1d == q2d) { 38255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q2); 38265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (sec > 0.0) 38274aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 38285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 38294aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 2; /* indeterminate */ 38305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 38314aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(p1); 38324aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(q1); 38334aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(q2); 38344aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard if (ret != 0) 38354aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard return(ret); 38365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 3837fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 3838fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 3839fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 3840fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } 38415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 38425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } else if (y->value.date.tz_flag) { 38435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1 = xmlSchemaDateNormalize(y, 0); 38445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day; 38455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize x - 14:00 */ 38475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1 = xmlSchemaDateNormalize(x, -(14 * SECS_PER_HOUR)); 38485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day; 38495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 3850fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (p1d < q1d) { 3851fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 3852fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 38535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 3854fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else if (p1d == q1d) { 38555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard double sec; 38565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1); 3858fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (sec < 0.0) { 3859fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 3860fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 38615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 3862fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 38634aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard int ret = 0; 38645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize x + 14:00 */ 38655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p2 = xmlSchemaDateNormalize(x, (14 * SECS_PER_HOUR)); 38665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p2d = _xmlSchemaDateCastYMToDays(p2) + p2->value.date.day; 38675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38686560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard if (p2d > q1d) { 38694aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 38706560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard } else if (p2d == q1d) { 38715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p2) - TIME_TO_NUMBER(q1); 38725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (sec > 0.0) 38734aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 38745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 38754aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 2; /* indeterminate */ 38765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 38776560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaFreeValue(p1); 38786560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaFreeValue(q1); 38796560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaFreeValue(p2); 38804aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard if (ret != 0) 38814aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard return(ret); 38825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 3883fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 3884fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 3885fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 38865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 38875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 38885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* 38905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * if the same type then calculate the difference 38915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 38925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->type == y->type) { 38934aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard int ret = 0; 38945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1 = xmlSchemaDateNormalize(y, 0); 38955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day; 38965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1 = xmlSchemaDateNormalize(x, 0); 38985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day; 38995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 3900fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (p1d < q1d) { 39014aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = -1; 3902fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else if (p1d > q1d) { 39034aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 3904fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 39055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard double sec; 39065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1); 39085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (sec < 0.0) 39094aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = -1; 39105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (sec > 0.0) 39114aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 39125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 39144aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(p1); 39154aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(q1); 39164aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard return(ret); 39175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 39185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard switch (x->type) { 39205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATETIME: 39215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0xf; 39225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 39235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATE: 39245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x7; 39255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 39265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEAR: 39275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x1; 39285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 39295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTH: 39305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x2; 39315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 39325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GDAY: 39335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x3; 39345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 39355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 39365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x3; 39375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 39385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 39395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x6; 39405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 39415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_TIME: 39425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x8; 39435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 39445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard default: 39455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0; 39465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 39475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 39485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard switch (y->type) { 39505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATETIME: 39515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0xf; 39525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 39535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATE: 39545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x7; 39555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 39565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEAR: 39575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x1; 39585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 39595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTH: 39605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x2; 39615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 39625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GDAY: 39635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x3; 39645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 39655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 39665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x3; 39675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 39685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 39695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x6; 39705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 39715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_TIME: 39725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x8; 39735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 39745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard default: 39755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0; 39765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 39775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 39785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xor_mask = xmask ^ ymask; /* mark type differences */ 39805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard and_mask = xmask & ymask; /* mark field specification */ 39815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* year */ 39835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (xor_mask & 1) 39845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 39855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (and_mask & 1) { 39865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.year < y->value.date.year) 39875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 39885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.year > y->value.date.year) 39895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 39905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 39915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* month */ 39935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (xor_mask & 2) 39945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 39955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (and_mask & 2) { 39965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.mon < y->value.date.mon) 39975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 39985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.mon > y->value.date.mon) 39995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 40005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 40015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 40025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* day */ 40035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (xor_mask & 4) 40045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 40055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (and_mask & 4) { 40065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.day < y->value.date.day) 40075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 40085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.day > y->value.date.day) 40095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 40105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 40115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 40125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* time */ 40135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (xor_mask & 8) 40145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 40155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (and_mask & 8) { 40165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.hour < y->value.date.hour) 40175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 40185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.hour > y->value.date.hour) 40195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 40205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.min < y->value.date.min) 40215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 40225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.min > y->value.date.min) 40235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 40245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.sec < y->value.date.sec) 40255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 40265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.sec > y->value.date.sec) 40275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 40285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 40295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 4030070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 4031070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 4032070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 4033070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 40346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveReplaceStrings: 4035478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @x: a first string value 4036478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @y: a second string value 40376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @invert: inverts the result if x < y or x > y. 40386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 40396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values. 40406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is 40416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "replace". I.e. @x could 40426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString". 40436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 40446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in 40456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 40466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 40476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int 4048478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaComparePreserveReplaceStrings(const xmlChar *x, 4049478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *y, 40506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int invert) 40516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 40526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int tmp; 40536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 4054478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while ((*x != 0) && (*y != 0)) { 4055478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (IS_WSP_REPLACE_CH(*y)) { 4056478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (! IS_WSP_SPACE_CH(*x)) { 4057478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((*x - 0x20) < 0) { 40586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 40596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 40606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 40616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 40626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 40636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 40646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 40656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 40666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 40676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 40686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 40696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 4070478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik tmp = *x - *y; 40716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp < 0) { 40726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 40736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 40746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 40756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 40766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 40776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp > 0) { 40786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 40796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 40806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 40816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 40826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 40836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4084478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik x++; 4085478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 40866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4087478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*x != 0) { 40886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 40896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 40906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 40916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 40926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4093478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) { 40946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 40956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 40966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 40976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 40986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 40996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(0); 41006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 41016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 41026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 41036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveCollapseStrings: 41046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x: a first string value 41056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y: a second string value 41066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 41076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values. 41086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is 41096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "collapse". I.e. @x could 41106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString". 41116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 41126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in 41136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 41146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 41156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int 4116478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaComparePreserveCollapseStrings(const xmlChar *x, 4117478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *y, 41186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int invert) 41196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 41206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int tmp; 41216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 41226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 41236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip leading blank chars of the collapsed string. 41246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4125478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while IS_WSP_BLANK_CH(*y) 4126478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 41276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 4128478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while ((*x != 0) && (*y != 0)) { 4129478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if IS_WSP_BLANK_CH(*y) { 4130478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (! IS_WSP_SPACE_CH(*x)) { 41316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 4132478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * The yv character would have been replaced to 0x20. 41336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4134478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((*x - 0x20) < 0) { 41356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 41366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 41376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 41386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 41396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 41406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 41416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 41426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 41436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 41446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 41456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4146478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik x++; 4147478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 41486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 41496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip contiguous blank chars of the collapsed string. 41506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4151478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while IS_WSP_BLANK_CH(*y) 4152478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 41536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 4154478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik tmp = *x++ - *y++; 41556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp < 0) { 41566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 41576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 41586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 41596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 41606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 41616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp > 0) { 41626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 41636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 41646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 41656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 41666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 41676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 41686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4169478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*x != 0) { 41706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 41716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 41726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 41736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 41746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4175478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) { 41766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 41776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip trailing blank chars of the collapsed string. 41786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4179478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while IS_WSP_BLANK_CH(*y) 4180478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 4181478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) { 41826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 41836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 41846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 41856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 41866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 41876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 41886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(0); 41896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 41906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 41916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 41926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveCollapseStrings: 41936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x: a first string value 41946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y: a second string value 41956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 41966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values. 41976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is 41986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "collapse". I.e. @x could 41996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString". 42006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 42016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in 42026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 42036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 42046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int 4205478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaCompareReplaceCollapseStrings(const xmlChar *x, 4206478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *y, 42076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int invert) 42086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 42096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int tmp; 42106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 42116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 42126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip leading blank chars of the collapsed string. 42136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4214478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while IS_WSP_BLANK_CH(*y) 4215478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 42166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 4217478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while ((*x != 0) && (*y != 0)) { 4218478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if IS_WSP_BLANK_CH(*y) { 4219478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (! IS_WSP_BLANK_CH(*x)) { 42206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 4221478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * The yv character would have been replaced to 0x20. 42226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4223478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((*x - 0x20) < 0) { 42246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 42256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 42266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 42276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 42286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 42296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 42306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 42316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 42326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 42336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 42346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4235478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik x++; 4236478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 42376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 42386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip contiguous blank chars of the collapsed string. 42396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4240478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while IS_WSP_BLANK_CH(*y) 4241478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 42426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 4243478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if IS_WSP_BLANK_CH(*x) { 42446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 4245478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * The xv character would have been replaced to 0x20. 42466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4247478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((0x20 - *y) < 0) { 42486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 42496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 42506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 42516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 42526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 42536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 42546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 42556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 42566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 42576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 42586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4259478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik tmp = *x++ - *y++; 42606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp < 0) 42616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 42626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp > 0) 42636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 42646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 42656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4266478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*x != 0) { 42676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 42686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 42696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 42706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 42716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4272478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) { 42736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 42746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip trailing blank chars of the collapsed string. 42756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4276478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while IS_WSP_BLANK_CH(*y) 4277478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 4278478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 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 return(0); 42866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 42876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 42886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 42896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 42906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareReplacedStrings: 42916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x: a first string value 42926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y: a second string value 42936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 42946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values. 42956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 42966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in 42976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 42986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 42996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int 4300478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaCompareReplacedStrings(const xmlChar *x, 4301478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *y) 43026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 43036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int tmp; 43046c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik 4305478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while ((*x != 0) && (*y != 0)) { 4306478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if IS_WSP_BLANK_CH(*y) { 4307478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (! IS_WSP_BLANK_CH(*x)) { 4308478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((*x - 0x20) < 0) 43096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 43106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 43116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 43126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 43136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 4314478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if IS_WSP_BLANK_CH(*x) { 4315478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((0x20 - *y) < 0) 43166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 43176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 43186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 43196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4320478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik tmp = *x - *y; 43216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp < 0) 43226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 43236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp > 0) 43246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 43256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4326478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik x++; 4327478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 43286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4329478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*x != 0) 43306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 4331478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) 43326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 43336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(0); 43346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 43356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 43366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 4337c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * xmlSchemaCompareNormStrings: 4338c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @x: a first string value 4339c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @y: a second string value 4340c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * 4341c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Compare 2 string for their normalized values. 4342c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * 4343c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in 4344c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * case of error 4345c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard */ 4346c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillardstatic int 4347478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaCompareNormStrings(const xmlChar *x, 4348478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *y) { 4349c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard int tmp; 4350c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 4351478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while (IS_BLANK_CH(*x)) x++; 4352478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while (IS_BLANK_CH(*y)) y++; 4353478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while ((*x != 0) && (*y != 0)) { 4354478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (IS_BLANK_CH(*x)) { 4355478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (!IS_BLANK_CH(*y)) { 4356478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik tmp = *x - *y; 4357c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(tmp); 4358c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4359478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while (IS_BLANK_CH(*x)) x++; 4360478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while (IS_BLANK_CH(*y)) y++; 4361c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } else { 4362478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik tmp = *x++ - *y++; 4363c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (tmp < 0) 4364c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 4365c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (tmp > 0) 4366c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(1); 4367c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4368c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4369478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*x != 0) { 4370478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while (IS_BLANK_CH(*x)) x++; 4371478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*x != 0) 4372c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(1); 4373c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4374478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) { 4375478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while (IS_BLANK_CH(*y)) y++; 4376478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) 4377c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 4378c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4379c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(0); 4380c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard} 4381c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 4382c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard/** 4383b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaCompareFloats: 4384b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @x: a first float or double value 4385b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @y: a second float or double value 4386b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 4387b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Compare 2 values 4388b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 4389b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 4390b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * case of error 4391b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 4392b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic int 4393b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaCompareFloats(xmlSchemaValPtr x, xmlSchemaValPtr y) { 4394b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard double d1, d2; 4395b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 4396b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((x == NULL) || (y == NULL)) 4397b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-2); 4398b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 4399b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard /* 4400b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Cast everything to doubles. 4401b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 4402b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (x->type == XML_SCHEMAS_DOUBLE) 4403b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard d1 = x->value.d; 4404b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else if (x->type == XML_SCHEMAS_FLOAT) 4405b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard d1 = x->value.f; 4406b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else 4407b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-2); 4408b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 4409b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (y->type == XML_SCHEMAS_DOUBLE) 4410b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard d2 = y->value.d; 4411b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else if (y->type == XML_SCHEMAS_FLOAT) 4412b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard d2 = y->value.f; 4413b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else 4414b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-2); 4415b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 4416b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard /* 4417b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check for special cases. 4418b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 4419b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (xmlXPathIsNaN(d1)) { 4420b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (xmlXPathIsNaN(d2)) 4421b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 4422b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 4423b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 4424b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (xmlXPathIsNaN(d2)) 4425b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 4426b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 == xmlXPathPINF) { 4427b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d2 == xmlXPathPINF) 4428b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 4429b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 4430b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 4431b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d2 == xmlXPathPINF) 4432b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 4433b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 == xmlXPathNINF) { 4434b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d2 == xmlXPathNINF) 4435b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 4436b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 4437b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 4438b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d2 == xmlXPathNINF) 4439b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 4440b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 4441b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard /* 4442b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * basic tests, the last one we should have equality, but 4443b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * portability is more important than speed and handling 4444b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * NaN or Inf in a portable way is always a challenge, so ... 4445b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 4446b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 < d2) 4447b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 4448b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 > d2) 4449b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 4450b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 == d2) 4451b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 4452b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(2); 4453b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard} 4454b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 4455b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/** 44564255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCompareValues: 44574255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @x: a first value 44586c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @xvalue: the first value as a string (optional) 44596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @xwtsp: the whitespace type 44604255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @y: a second value 44616c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @xvalue: the second value as a string (optional) 44626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @ywtsp: the whitespace type 44634255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 44644255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Compare 2 values 44654255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 44664efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, 3 if not 44674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * comparable and -2 in case of error 44684255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 44696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int 44706c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaCompareValuesInternal(xmlSchemaValType xtype, 44716c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaValPtr x, 44726c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *xvalue, 44736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xmlSchemaWhitespaceValueType xws, 44746c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaValType ytype, 44756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xmlSchemaValPtr y, 44766c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *yvalue, 4477478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaWhitespaceValueType yws) 4478478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{ 44796c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik switch (xtype) { 448080b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_UNKNOWN: 44812f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack case XML_SCHEMAS_ANYTYPE: 448280b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(-2); 448380b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_INTEGER: 448480b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NPINTEGER: 448580b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NINTEGER: 448680b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NNINTEGER: 448780b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_PINTEGER: 448880b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_INT: 448980b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_UINT: 449080b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_LONG: 449180b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_ULONG: 449280b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_SHORT: 449380b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_USHORT: 449480b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_BYTE: 449580b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_UBYTE: 44964255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard case XML_SCHEMAS_DECIMAL: 44976c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 44986c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 44996c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ytype == xtype) 450080b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(xmlSchemaCompareDecimals(x, y)); 45016c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((ytype == XML_SCHEMAS_DECIMAL) || 45026c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_INTEGER) || 45036c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_NPINTEGER) || 45046c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_NINTEGER) || 45056c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_NNINTEGER) || 45066c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_PINTEGER) || 45076c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_INT) || 45086c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_UINT) || 45096c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_LONG) || 45106c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_ULONG) || 45116c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_SHORT) || 45126c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_USHORT) || 45136c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_BYTE) || 45146c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_UBYTE)) 45154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(xmlSchemaCompareDecimals(x, y)); 45165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return(-2); 4517070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case XML_SCHEMAS_DURATION: 45186c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 45196c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 4520478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (ytype == XML_SCHEMAS_DURATION) 4521070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(xmlSchemaCompareDurations(x, y)); 45225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return(-2); 45235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_TIME: 45245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GDAY: 45255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTH: 45265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 45275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEAR: 45285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 45295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATE: 45305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATETIME: 45316c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 45326c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 45336c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((ytype == XML_SCHEMAS_DATETIME) || 45346c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_TIME) || 45356c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_GDAY) || 45366c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_GMONTH) || 45376c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_GMONTHDAY) || 45386c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_GYEAR) || 45396c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_DATE) || 45406c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_GYEARMONTH)) 45415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return (xmlSchemaCompareDates(x, y)); 45425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return (-2); 45432ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik /* 45442ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * Note that we will support comparison of string types against 45452ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * anySimpleType as well. 45462ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik */ 45472ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik case XML_SCHEMAS_ANYSIMPLETYPE: 45486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_STRING: 45496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_NORMSTRING: 455080b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_TOKEN: 455180b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_LANGUAGE: 455280b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NMTOKEN: 455380b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NAME: 455480b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NCNAME: 455580b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_ID: 455680b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_IDREF: 455780b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_ENTITY: 455880b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_ANYURI: 45596c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik { 45606c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *xv, *yv; 45616c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik 45626c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (x == NULL) 45636c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xv = xvalue; 45646c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik else 45656c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xv = x->value.str; 45666c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (y == NULL) 45676c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik yv = yvalue; 45686c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik else 45696c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik yv = y->value.str; 45706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 45716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * TODO: Compare those against QName. 45726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 45736c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ytype == XML_SCHEMAS_QNAME) { 45746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik TODO 45756c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (y == NULL) 45766c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 45776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (-2); 45786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 45796c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((ytype == XML_SCHEMAS_ANYSIMPLETYPE) || 45806c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_STRING) || 45816c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_NORMSTRING) || 45826c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_TOKEN) || 45836c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_LANGUAGE) || 45846c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_NMTOKEN) || 45856c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_NAME) || 45866c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_NCNAME) || 45876c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_ID) || 45886c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_IDREF) || 45896c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_ENTITY) || 45906c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_ANYURI)) { 45916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 45926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (xws == XML_SCHEMA_WHITESPACE_PRESERVE) { 45936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 45946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) { 45956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* TODO: What about x < y or x > y. */ 45966c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (xmlStrEqual(xv, yv)) 45976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (0); 45986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 45996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (2); 46006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else if (yws == XML_SCHEMA_WHITESPACE_REPLACE) 46016c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaComparePreserveReplaceStrings(xv, yv, 0)); 46026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE) 46036c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaComparePreserveCollapseStrings(xv, yv, 0)); 46046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 46056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else if (xws == XML_SCHEMA_WHITESPACE_REPLACE) { 46066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 46076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) 46086c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaComparePreserveReplaceStrings(yv, xv, 1)); 46096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_REPLACE) 46106c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaCompareReplacedStrings(xv, yv)); 46116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE) 46126c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaCompareReplaceCollapseStrings(xv, yv, 0)); 46136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 46146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else if (xws == XML_SCHEMA_WHITESPACE_COLLAPSE) { 46156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 46166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) 46176c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaComparePreserveCollapseStrings(yv, xv, 1)); 46186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_REPLACE) 46196c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaCompareReplaceCollapseStrings(yv, xv, 1)); 46206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE) 46216c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaCompareNormStrings(xv, yv)); 46226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else 46236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (-2); 46246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 46256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4626c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return (-2); 46276c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik } 4628e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_QNAME: 4629c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_NOTATION: 46306c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 46316c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 4632c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((ytype == XML_SCHEMAS_QNAME) || 4633c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik (ytype == XML_SCHEMAS_NOTATION)) { 4634e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((xmlStrEqual(x->value.qname.name, y->value.qname.name)) && 4635e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (xmlStrEqual(x->value.qname.uri, y->value.qname.uri))) 4636e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return(0); 4637e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return(2); 4638e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 4639e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return (-2); 4640c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_FLOAT: 4641c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_DOUBLE: 46426c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 46436c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 46446c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((ytype == XML_SCHEMAS_FLOAT) || 46456c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_DOUBLE)) 4646b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return (xmlSchemaCompareFloats(x, y)); 4647b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return (-2); 4648c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_BOOLEAN: 46496c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 46506c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 46516c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ytype == XML_SCHEMAS_BOOLEAN) { 4652b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (x->value.b == y->value.b) 4653b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 4654b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (x->value.b == 0) 4655b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 4656b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 4657b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 4658b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return (-2); 4659560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_HEXBINARY: 46606c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 46616c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 46626c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ytype == XML_SCHEMAS_HEXBINARY) { 466370bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard if (x->value.hex.total == y->value.hex.total) { 466470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard int ret = xmlStrcmp(x->value.hex.str, y->value.hex.str); 466570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard if (ret > 0) 466670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard return(1); 466770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard else if (ret == 0) 466870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard return(0); 466970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard } 467070bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard else if (x->value.hex.total > y->value.hex.total) 467170bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard return(1); 467270bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard 467370bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard return(-1); 467470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard } 4675560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard return (-2); 46761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_BASE64BINARY: 46776c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 46786c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 46796c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ytype == XML_SCHEMAS_BASE64BINARY) { 46801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (x->value.base64.total == y->value.base64.total) { 46811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int ret = xmlStrcmp(x->value.base64.str, 46821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard y->value.base64.str); 46831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret > 0) 46841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return(1); 46851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (ret == 0) 46861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return(0); 46871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 46881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (x->value.base64.total > y->value.base64.total) 46891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return(1); 46901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 46911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return(-1); 46921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 46936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (-2); 4694c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_IDREFS: 4695c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_ENTITIES: 4696c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_NMTOKENS: 4697c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard TODO 4698c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard break; 46994255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 47005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -2; 47014255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 47024255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 47034255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 47046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareValues: 47056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x: a first value 47066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y: a second value 47076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 47086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 values 47096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 47106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 47116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 47126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 47136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint 47146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareValues(xmlSchemaValPtr x, xmlSchemaValPtr y) { 47156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xmlSchemaWhitespaceValueType xws, yws; 47166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 47175e094143e423c01739ac9221f371846fd290be4eDaniel Veillard if ((x == NULL) || (y == NULL)) 47185e094143e423c01739ac9221f371846fd290be4eDaniel Veillard return(-2); 47196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (x->type == XML_SCHEMAS_STRING) 47206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xws = XML_SCHEMA_WHITESPACE_PRESERVE; 47216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else if (x->type == XML_SCHEMAS_NORMSTRING) 47226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xws = XML_SCHEMA_WHITESPACE_REPLACE; 47236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 47246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xws = XML_SCHEMA_WHITESPACE_COLLAPSE; 47256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 47266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (y->type == XML_SCHEMAS_STRING) 47276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik yws = XML_SCHEMA_WHITESPACE_PRESERVE; 47286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else if (x->type == XML_SCHEMAS_NORMSTRING) 47296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik yws = XML_SCHEMA_WHITESPACE_REPLACE; 47306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 47316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik yws = XML_SCHEMA_WHITESPACE_COLLAPSE; 47326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 47336c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(xmlSchemaCompareValuesInternal(x->type, x, NULL, xws, y->type, 47346c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik y, NULL, yws)); 47356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 47366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 47376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 47386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareValuesWhtsp: 47396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x: a first value 47406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @xws: the whitespace value of x 47416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y: a second value 47426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @yws: the whitespace value of y 47436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 47446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 values 47456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 47466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 47476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 47486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 47496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint 47506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareValuesWhtsp(xmlSchemaValPtr x, 47516c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType xws, 47526c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaValPtr y, 47536c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType yws) 47546c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{ 47559dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 47569dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik return(-2); 47576c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(xmlSchemaCompareValuesInternal(x->type, x, NULL, xws, y->type, 47586c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik y, NULL, yws)); 47596c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik} 47606c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik 47616c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik/** 47626c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaCompareValuesWhtspExt: 47636c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @x: a first value 47646c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @xws: the whitespace value of x 47656c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @y: a second value 47666c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @yws: the whitespace value of y 47676c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * 47686c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Compare 2 values 47696c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * 47706c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 47716c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * case of error 47726c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */ 47736c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikstatic int 47746c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaCompareValuesWhtspExt(xmlSchemaValType xtype, 47756c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaValPtr x, 47766c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *xvalue, 47776c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType xws, 47786c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaValType ytype, 47796c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaValPtr y, 47806c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *yvalue, 47816c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType yws) 47826c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{ 47836c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(xmlSchemaCompareValuesInternal(xtype, x, xvalue, xws, ytype, y, 47846c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik yvalue, yws)); 47856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 47866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 47876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 4788c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * xmlSchemaNormLen: 4789c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @value: a string 4790c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * 4791c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Computes the UTF8 length of the normalized value of the string 4792c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * 4793c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Returns the length or -1 in case of error. 4794c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard */ 4795c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillardstatic int 4796c4c215519fae43487ab55bbe1f923646af40d306Daniel VeillardxmlSchemaNormLen(const xmlChar *value) { 4797c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard const xmlChar *utf; 4798c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard int ret = 0; 4799c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 4800c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (value == NULL) 4801c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 4802c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf = value; 480376e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*utf)) utf++; 4804c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard while (*utf != 0) { 4805c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (utf[0] & 0x80) { 4806c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[1] & 0xc0) != 0x80) 4807c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 4808c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[0] & 0xe0) == 0xe0) { 4809c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[2] & 0xc0) != 0x80) 4810c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 4811c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[0] & 0xf0) == 0xf0) { 4812c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[0] & 0xf8) != 0xf0 || (utf[3] & 0xc0) != 0x80) 4813c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 4814c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf += 4; 4815c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } else { 4816c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf += 3; 4817c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4818c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } else { 4819c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf += 2; 4820c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 482176e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack } else if (IS_BLANK_CH(*utf)) { 482276e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*utf)) utf++; 4823c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (*utf == 0) 4824c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard break; 4825c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } else { 4826c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf++; 4827c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4828c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard ret++; 4829c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4830c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(ret); 4831c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard} 4832c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 48336927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard/** 48346927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaGetFacetValueAsULong: 48356927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * @facet: an schemas type facet 48366927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * 48376927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Extract the value of a facet 48386927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * 48396927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Returns the value as a long 48406927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard */ 4841c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardunsigned long 4842c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaGetFacetValueAsULong(xmlSchemaFacetPtr facet) 4843c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard{ 4844c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard /* 4845c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * TODO: Check if this is a decimal. 4846c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */ 4847094dd86c130f3ffb7ec9bc47bb0ed711e0f68994William M. Brack if (facet == NULL) 4848094dd86c130f3ffb7ec9bc47bb0ed711e0f68994William M. Brack return 0; 4849c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return ((unsigned long) facet->val->value.decimal.lo); 4850c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard} 4851c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 4852c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard/** 485301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaValidateListSimpleTypeFacet: 485401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @facet: the facet to check 485501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @value: the lexical repr of the value to validate 485601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @actualLen: the number of list items 485701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @expectedLen: the resulting expected number of list items 485801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 485901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Checks the value of a list simple type against a facet. 486001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 486101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns 0 if the value is valid, a positive error code 486201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * number otherwise and -1 in case of an internal error. 486301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 486401fa6156e51259229470f40619af93e915b4bc94Daniel Veillardint 486501fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaValidateListSimpleTypeFacet(xmlSchemaFacetPtr facet, 486601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard const xmlChar *value, 486701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard unsigned long actualLen, 486801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard unsigned long *expectedLen) 486901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{ 4870ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard if (facet == NULL) 4871ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard return(-1); 487201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard /* 487301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * TODO: Check if this will work with large numbers. 487401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * (compare value.decimal.mi and value.decimal.hi as well?). 487501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 487601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (facet->type == XML_SCHEMA_FACET_LENGTH) { 487701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (actualLen != facet->val->value.decimal.lo) { 4878478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (expectedLen != NULL) 4879c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *expectedLen = facet->val->value.decimal.lo; 488001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (XML_SCHEMAV_CVC_LENGTH_VALID); 488101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 488201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) { 488301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (actualLen < facet->val->value.decimal.lo) { 4884478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (expectedLen != NULL) 4885c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *expectedLen = facet->val->value.decimal.lo; 488601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (XML_SCHEMAV_CVC_MINLENGTH_VALID); 488701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 488801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_MAXLENGTH) { 488901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (actualLen > facet->val->value.decimal.lo) { 4890478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (expectedLen != NULL) 4891c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *expectedLen = facet->val->value.decimal.lo; 489201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (XML_SCHEMAV_CVC_MAXLENGTH_VALID); 489301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 489401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else 489501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard /* 489601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * NOTE: That we can pass NULL as xmlSchemaValPtr to 489701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaValidateFacet, since the remaining facet types 489801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * are: XML_SCHEMA_FACET_PATTERN, XML_SCHEMA_FACET_ENUMERATION. 489901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 490001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(xmlSchemaValidateFacet(NULL, facet, value, NULL)); 490101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (0); 490201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard} 490301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 490401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/** 49056927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaValidateLengthFacet: 4906c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @type: the built-in type 4907c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @facet: the facet to check 4908c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @value: the lexical repr. of the value to be validated 4909c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @val: the precomputed value 4910478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @ws: the whitespace type of the value 4911c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @length: the actual length of the value 4912c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * 4913c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Checka a value against a "length", "minLength" and "maxLength" 4914c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * facet; sets @length to the computed length of @value. 4915c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * 4916c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns 0 if the value is valid, a positive error code 4917c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * otherwise and -1 in case of an internal or API error. 4918c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */ 4919478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcikstatic int 4920478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaValidateLengthFacetInternal(xmlSchemaFacetPtr facet, 4921478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaTypeType valType, 4922478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *value, 4923478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaValPtr val, 4924478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik unsigned long *length, 4925478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaWhitespaceValueType ws) 4926c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard{ 4927c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard unsigned int len = 0; 4928c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 4929478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((length == NULL) || (facet == NULL)) 4930ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard return (-1); 4931c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *length = 0; 4932c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if ((facet->type != XML_SCHEMA_FACET_LENGTH) && 4933c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard (facet->type != XML_SCHEMA_FACET_MAXLENGTH) && 4934c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard (facet->type != XML_SCHEMA_FACET_MINLENGTH)) 4935c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return (-1); 4936c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 4937478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik /* 4938478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * TODO: length, maxLength and minLength must be of type 4939478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * nonNegativeInteger only. Check if decimal is used somehow. 4940478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 4941c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if ((facet->val == NULL) || 4942c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard ((facet->val->type != XML_SCHEMAS_DECIMAL) && 4943c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard (facet->val->type != XML_SCHEMAS_NNINTEGER)) || 4944c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard (facet->val->value.decimal.frac != 0)) { 4945c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return(-1); 4946c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } 4947c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY)) 4948c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard len = val->value.hex.total; 4949c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY)) 4950c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard len = val->value.base64.total; 4951c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard else { 4952478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik switch (valType) { 4953478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik case XML_SCHEMAS_STRING: 4954c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_NORMSTRING: 4955478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) { 4956478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik /* 4957478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * This is to ensure API compatibility with the old 4958478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * xmlSchemaValidateLengthFacet(). Anyway, this was and 4959478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * is not the correct handling. 4960478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * TODO: Get rid of this case somehow. 4961478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 4962478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (valType == XML_SCHEMAS_STRING) 4963478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlUTF8Strlen(value); 4964478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik else 4965478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlSchemaNormLen(value); 4966478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik } else if (value != NULL) { 4967478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) 4968478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlSchemaNormLen(value); 4969478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik else 4970478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik /* 4971478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Should be OK for "preserve" as well. 4972478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 4973478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlUTF8Strlen(value); 4974478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik } 4975478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik break; 4976478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik case XML_SCHEMAS_IDREF: 4977c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_TOKEN: 4978c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_LANGUAGE: 4979c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_NMTOKEN: 4980c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_NAME: 4981c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_NCNAME: 4982bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik case XML_SCHEMAS_ID: 4983bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik /* 4984bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik * FIXME: What exactly to do with anyURI? 4985478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 4986c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_ANYURI: 4987c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (value != NULL) 4988478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlSchemaNormLen(value); 4989c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard break; 4990bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik case XML_SCHEMAS_QNAME: 4991bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik case XML_SCHEMAS_NOTATION: 4992bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik /* 49934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * For QName and NOTATION, those facets are 49944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * deprecated and should be ignored. 4995bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik */ 4996bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik return (0); 4997c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard default: 4998c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard TODO 4999c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } 5000c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } 5001c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *length = (unsigned long) len; 5002478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik /* 5003478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * TODO: Return the whole expected value, i.e. "lo", "mi" and "hi". 5004478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5005c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (facet->type == XML_SCHEMA_FACET_LENGTH) { 5006c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (len != facet->val->value.decimal.lo) 5007c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return(XML_SCHEMAV_CVC_LENGTH_VALID); 5008c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) { 5009c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (len < facet->val->value.decimal.lo) 5010c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return(XML_SCHEMAV_CVC_MINLENGTH_VALID); 5011c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } else { 5012c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (len > facet->val->value.decimal.lo) 5013c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return(XML_SCHEMAV_CVC_MAXLENGTH_VALID); 5014c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } 5015c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 5016c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return (0); 5017c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard} 5018c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 5019c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard/** 5020478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * xmlSchemaValidateLengthFacet: 5021478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @type: the built-in type 5022478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @facet: the facet to check 5023478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @value: the lexical repr. of the value to be validated 5024478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @val: the precomputed value 5025478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @length: the actual length of the value 5026478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * 5027478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Checka a value against a "length", "minLength" and "maxLength" 5028478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * facet; sets @length to the computed length of @value. 5029478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * 5030478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Returns 0 if the value is valid, a positive error code 5031478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * otherwise and -1 in case of an internal or API error. 5032478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5033478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcikint 5034478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaValidateLengthFacet(xmlSchemaTypePtr type, 5035478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaFacetPtr facet, 5036478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *value, 5037478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaValPtr val, 5038478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik unsigned long *length) 5039478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{ 5040cc5e2330ef2432493afce6566d3651195366d822Daniel Veillard if (type == NULL) 5041cc5e2330ef2432493afce6566d3651195366d822Daniel Veillard return(-1); 5042478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik return (xmlSchemaValidateLengthFacetInternal(facet, 5043478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik type->builtInType, value, val, length, 5044478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik XML_SCHEMA_WHITESPACE_UNKNOWN)); 5045478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik} 5046478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik 5047478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik/** 5048478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * xmlSchemaValidateLengthFacetWhtsp: 5049478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @facet: the facet to check 5050478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @valType: the built-in type 5051478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @value: the lexical repr. of the value to be validated 5052478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @val: the precomputed value 5053478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @ws: the whitespace type of the value 5054478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @length: the actual length of the value 5055478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * 5056478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Checka a value against a "length", "minLength" and "maxLength" 5057478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * facet; sets @length to the computed length of @value. 5058478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * 5059478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Returns 0 if the value is valid, a positive error code 5060478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * otherwise and -1 in case of an internal or API error. 5061478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5062478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcikint 5063478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaValidateLengthFacetWhtsp(xmlSchemaFacetPtr facet, 5064478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaValType valType, 5065478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *value, 5066478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaValPtr val, 5067478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik unsigned long *length, 5068478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaWhitespaceValueType ws) 5069478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{ 5070478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik return (xmlSchemaValidateLengthFacetInternal(facet, valType, value, val, 5071478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik length, ws)); 5072478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik} 5073478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik 5074478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik/** 50756c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacetInternal: 50764255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @facet: the facet to check 5077478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @fws: the whitespace type of the facet's value 5078478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @valType: the built-in type of the value 50794255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value: the lexical repr of the value to validate 50804255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @val: the precomputed value 5081478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @ws: the whitespace type of the value 50824255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 50834255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Check a value against a facet condition 50844255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 50854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns 0 if the element is schemas valid, a positive error code 50864255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * number otherwise and -1 in case of internal or API error. 50874255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 50886c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikstatic int 50896c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaValidateFacetInternal(xmlSchemaFacetPtr facet, 50906c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType fws, 5091478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaValType valType, 50926c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *value, 5093478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaValPtr val, 50946c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType ws) 50954255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard{ 50964255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard int ret; 50974255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 50986c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (facet == NULL) 50996c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-1); 51006c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik 51014255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard switch (facet->type) { 51024255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard case XML_SCHEMA_FACET_PATTERN: 51036c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik /* 51046c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * NOTE that for patterns, the @value needs to be the normalized 51056c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * value, *not* the lexical initial value or the canonical value. 51066c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */ 51076c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (value == NULL) 51086c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-1); 51094255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard ret = xmlRegexpExec(facet->regexp, value); 51104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (ret == 1) 51114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(0); 51126c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ret == 0) 511301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_PATTERN_VALID); 51144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(ret); 51154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard case XML_SCHEMA_FACET_MAXEXCLUSIVE: 51164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard ret = xmlSchemaCompareValues(val, facet->val); 51176c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ret == -2) 51184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(-1); 51194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (ret == -1) 51204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(0); 512101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID); 5122070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case XML_SCHEMA_FACET_MAXINCLUSIVE: 5123070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = xmlSchemaCompareValues(val, facet->val); 51246c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ret == -2) 5125070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(-1); 5126070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((ret == -1) || (ret == 0)) 5127070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(0); 512801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID); 5129070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case XML_SCHEMA_FACET_MINEXCLUSIVE: 5130070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = xmlSchemaCompareValues(val, facet->val); 51316c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ret == -2) 5132070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(-1); 5133070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == 1) 5134070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(0); 513501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID); 5136070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case XML_SCHEMA_FACET_MININCLUSIVE: 5137070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = xmlSchemaCompareValues(val, facet->val); 51386c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ret == -2) 5139070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(-1); 5140070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((ret == 1) || (ret == 0)) 5141070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(0); 514201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MININCLUSIVE_VALID); 51438651f5365c182ce5c52fe1cdc2b9d72b2ecc34e2Daniel Veillard case XML_SCHEMA_FACET_WHITESPACE: 51448bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard /* TODO whitespaces */ 514501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard /* 514601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * NOTE: Whitespace should be handled to normalize 514701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * the value to be validated against a the facets; 514801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * not to normalize the value in-between. 514901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 51508651f5365c182ce5c52fe1cdc2b9d72b2ecc34e2Daniel Veillard return(0); 51518bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard case XML_SCHEMA_FACET_ENUMERATION: 5152478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) { 5153478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik /* 5154478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * This is to ensure API compatibility with the old 5155478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * xmlSchemaValidateFacet(). 5156478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * TODO: Get rid of this case. 5157478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 51586c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((facet->value != NULL) && 51596c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (xmlStrEqual(facet->value, value))) 51606c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(0); 51616c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik } else { 51626c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik ret = xmlSchemaCompareValuesWhtspExt(facet->val->type, 51636c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik facet->val, facet->value, fws, valType, val, 51646c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik value, ws); 51656c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ret == -2) 51666c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-1); 51676c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ret == 0) 51686c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(0); 51696c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik } 517001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_ENUMERATION_VALID); 51718bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard case XML_SCHEMA_FACET_LENGTH: 5172aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik /* 5173aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik * SPEC (1.3) "if {primitive type definition} is QName or NOTATION, 5174aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik * then any {value} is facet-valid." 5175aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik */ 5176aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik if ((valType == XML_SCHEMAS_QNAME) || 5177aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik (valType == XML_SCHEMAS_NOTATION)) 5178aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik return (0); 5179aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik /* No break on purpose. */ 5180e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard case XML_SCHEMA_FACET_MAXLENGTH: 51818bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard case XML_SCHEMA_FACET_MINLENGTH: { 51828bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard unsigned int len = 0; 5183e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard 51844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((valType == XML_SCHEMAS_QNAME) || 51854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik (valType == XML_SCHEMAS_NOTATION)) 51864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (0); 5187478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik /* 5188478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * TODO: length, maxLength and minLength must be of type 5189478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * nonNegativeInteger only. Check if decimal is used somehow. 5190478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 51918bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard if ((facet->val == NULL) || 5192e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((facet->val->type != XML_SCHEMAS_DECIMAL) && 5193e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (facet->val->type != XML_SCHEMAS_NNINTEGER)) || 51948bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard (facet->val->value.decimal.frac != 0)) { 51958bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard return(-1); 51968bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } 5197560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY)) 519870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard len = val->value.hex.total; 51991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY)) 52001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard len = val->value.base64.total; 52011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else { 52026c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik switch (valType) { 5203478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik case XML_SCHEMAS_STRING: 5204478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik case XML_SCHEMAS_NORMSTRING: 5205478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) { 5206478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik /* 5207478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * This is to ensure API compatibility with the old 5208478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * xmlSchemaValidateFacet(). Anyway, this was and 5209478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * is not the correct handling. 5210478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * TODO: Get rid of this case somehow. 5211478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5212478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (valType == XML_SCHEMAS_STRING) 5213478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlUTF8Strlen(value); 5214478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik else 5215478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlSchemaNormLen(value); 5216478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik } else if (value != NULL) { 5217478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) 5218478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlSchemaNormLen(value); 5219478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik else 5220478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik /* 5221478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Should be OK for "preserve" as well. 5222478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5223478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlUTF8Strlen(value); 5224478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik } 5225478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik break; 5226478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik case XML_SCHEMAS_IDREF: 5227560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_TOKEN: 5228560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_LANGUAGE: 5229560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_NMTOKEN: 5230560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_NAME: 5231560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_NCNAME: 5232560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_ID: 523301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ANYURI: 5234478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (value != NULL) 5235478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlSchemaNormLen(value); 5236478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik break; 5237560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard default: 5238560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard TODO 523970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard } 52408bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } 52418bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard if (facet->type == XML_SCHEMA_FACET_LENGTH) { 5242e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (len != facet->val->value.decimal.lo) 524301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_LENGTH_VALID); 52448bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) { 5245e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (len < facet->val->value.decimal.lo) 524601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MINLENGTH_VALID); 52478bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } else { 5248e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (len > facet->val->value.decimal.lo) 524901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MAXLENGTH_VALID); 5250e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard } 52518bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard break; 52528bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } 5253560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMA_FACET_TOTALDIGITS: 5254560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMA_FACET_FRACTIONDIGITS: 5255560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 5256560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if ((facet->val == NULL) || 5257560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard ((facet->val->type != XML_SCHEMAS_DECIMAL) && 5258560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (facet->val->type != XML_SCHEMAS_NNINTEGER)) || 5259560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (facet->val->value.decimal.frac != 0)) { 5260560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard return(-1); 5261560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } 5262560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if ((val == NULL) || 5263560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard ((val->type != XML_SCHEMAS_DECIMAL) && 5264560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_INTEGER) && 5265560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_NPINTEGER) && 5266560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_NINTEGER) && 5267560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_NNINTEGER) && 5268560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_PINTEGER) && 5269560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_INT) && 5270560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_UINT) && 5271560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_LONG) && 5272560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_ULONG) && 5273560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_SHORT) && 5274560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_USHORT) && 5275560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_BYTE) && 5276560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_UBYTE))) { 5277560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard return(-1); 5278560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } 5279560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if (facet->type == XML_SCHEMA_FACET_TOTALDIGITS) { 5280560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if (val->value.decimal.total > facet->val->value.decimal.lo) 528101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_TOTALDIGITS_VALID); 5282560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 5283560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_FRACTIONDIGITS) { 5284560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if (val->value.decimal.frac > facet->val->value.decimal.lo) 528501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID); 5286560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } 5287560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard break; 52884255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard default: 52894255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard TODO 52904255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 52914255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(0); 5292b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 52934255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 52944255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 52956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 52966c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacet: 52976c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @base: the base type 52986c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @facet: the facet to check 52996c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @value: the lexical repr of the value to validate 53006c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @val: the precomputed value 53016c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * 53026c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Check a value against a facet condition 53036c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * 53046c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Returns 0 if the element is schemas valid, a positive error code 53056c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * number otherwise and -1 in case of internal or API error. 53066c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */ 53076c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikint 53089dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. BuchcikxmlSchemaValidateFacet(xmlSchemaTypePtr base, 53096c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaFacetPtr facet, 53106c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *value, 53116c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaValPtr val) 53126c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{ 53136c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik /* 53146c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * This tries to ensure API compatibility regarding the old 53156c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacet() and the new xmlSchemaValidateFacetInternal() and 53166c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacetWhtsp(). 53176c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */ 53189dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik if (val != NULL) 53196c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(xmlSchemaValidateFacetInternal(facet, 53209dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik XML_SCHEMA_WHITESPACE_UNKNOWN, val->type, value, val, 53216c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik XML_SCHEMA_WHITESPACE_UNKNOWN)); 53229dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik else if (base != NULL) 53236c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(xmlSchemaValidateFacetInternal(facet, 53249dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik XML_SCHEMA_WHITESPACE_UNKNOWN, base->builtInType, value, val, 5325478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik XML_SCHEMA_WHITESPACE_UNKNOWN)); 53269dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik return(-1); 53276c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik} 53286c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik 53296c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik/** 53306c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacetWhtsp: 53316c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @facet: the facet to check 53326c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @fws: the whitespace type of the facet's value 53336c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @valType: the built-in type of the value 53346c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @value: the lexical (or normalized for pattern) repr of the value to validate 53356c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @val: the precomputed value 53366c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @ws: the whitespace type of the value 53376c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * 53386c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Check a value against a facet condition. This takes value normalization 53396c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * according to the specified whitespace types into account. 53406c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Note that @value needs to be the *normalized* value if the facet 53416c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * is of type "pattern". 53426c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * 53436c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Returns 0 if the element is schemas valid, a positive error code 53446c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * number otherwise and -1 in case of internal or API error. 53456c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */ 53466c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikint 53476c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaValidateFacetWhtsp(xmlSchemaFacetPtr facet, 53486c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType fws, 5349478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaValType valType, 53506c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *value, 5351478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaValPtr val, 53526c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType ws) 53536c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{ 53546c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(xmlSchemaValidateFacetInternal(facet, fws, valType, 5355478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik value, val, ws)); 53566c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik} 53576c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik 5358c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#if 0 5359c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#ifndef DBL_DIG 5360c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define DBL_DIG 16 5361c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#endif 5362c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#ifndef DBL_EPSILON 5363c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define DBL_EPSILON 1E-9 5364c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#endif 5365c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5366c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define INTEGER_DIGITS DBL_DIG 5367c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define FRACTION_DIGITS (DBL_DIG + 1) 5368c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define EXPONENT_DIGITS (3 + 2) 5369c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5370c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik/** 5371c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * xmlXPathFormatNumber: 5372c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @number: number to format 5373c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @buffer: output buffer 5374c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @buffersize: size of output buffer 5375c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * 5376c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Convert the number into a string representation. 5377c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5378c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcikstatic void 5379c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. BuchcikxmlSchemaFormatFloat(double number, char buffer[], int buffersize) 5380c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik{ 5381c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik switch (xmlXPathIsInf(number)) { 5382c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case 1: 5383c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (buffersize > (int)sizeof("INF")) 5384c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buffer, buffersize, "INF"); 5385c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5386c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case -1: 5387c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (buffersize > (int)sizeof("-INF")) 5388c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buffer, buffersize, "-INF"); 5389c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5390c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik default: 5391c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (xmlXPathIsNaN(number)) { 5392c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (buffersize > (int)sizeof("NaN")) 5393c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buffer, buffersize, "NaN"); 5394c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else if (number == 0) { 5395c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buffer, buffersize, "0.0E0"); 5396c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5397c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 3 is sign, decimal point, and terminating zero */ 5398c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char work[DBL_DIG + EXPONENT_DIGITS + 3]; 5399c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik int integer_place, fraction_place; 5400c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char *ptr; 5401c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char *after_fraction; 5402c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik double absolute_value; 5403c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik int size; 5404c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5405c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik absolute_value = fabs(number); 5406c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5407c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5408c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Result is in work, and after_fraction points 5409c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * just past the fractional part. 5410c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Use scientific notation 5411c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5412c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik integer_place = DBL_DIG + EXPONENT_DIGITS + 1; 5413c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik fraction_place = DBL_DIG - 1; 5414c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(work, sizeof(work),"%*.*e", 5415c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik integer_place, fraction_place, number); 5416c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik after_fraction = strchr(work + DBL_DIG, 'e'); 5417c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* Remove fractional trailing zeroes */ 5418c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik ptr = after_fraction; 5419c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik while (*(--ptr) == '0') 5420c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik ; 5421c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (*ptr != '.') 5422c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik ptr++; 5423c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik while ((*ptr++ = *after_fraction++) != 0); 5424c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5425c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* Finally copy result back to caller */ 5426c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik size = strlen(work) + 1; 5427c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (size > buffersize) { 5428c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik work[buffersize - 1] = 0; 5429c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik size = buffersize; 5430c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5431c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik memmove(buffer, work, size); 5432c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5433c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5434c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5435c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik} 5436c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#endif 5437c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 54386c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik/** 54396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaGetCanonValue: 54406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @val: the precomputed value 54416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @retValue: the returned value 54426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 5443478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Get a the cononical lexical representation of the value. 5444c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * The caller has to FREE the returned retValue. 5445c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * 5446478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * WARNING: Some value types are not supported yet, resulting 5447478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * in a @retValue of "???". 5448c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * 5449c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: XML Schema 1.0 does not define canonical representations 5450c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * for: duration, gYearMonth, gYear, gMonthDay, gMonth, gDay, 5451c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * anyURI, QName, NOTATION. This will be fixed in XML Schema 1.1. 5452c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * 54536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 5454c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Returns 0 if the value could be built, 1 if the value type is 5455c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * not supported yet and -1 in case of API errors. 54566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 54576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint 5458b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel VeillardxmlSchemaGetCanonValue(xmlSchemaValPtr val, const xmlChar **retValue) 54596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 5460b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard if ((retValue == NULL) || (val == NULL)) 54616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (-1); 54626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *retValue = NULL; 54636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik switch (val->type) { 5464478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik case XML_SCHEMAS_STRING: 5465478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (val->value.str == NULL) 5466478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST ""); 5467478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik else 5468478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = 5469478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik BAD_CAST xmlStrdup((const xmlChar *) val->value.str); 5470478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik break; 54716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_NORMSTRING: 5472478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (val->value.str == NULL) 5473478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST ""); 5474478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik else { 5475478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = xmlSchemaWhiteSpaceReplace( 5476478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik (const xmlChar *) val->value.str); 5477478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((*retValue) == NULL) 5478478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrdup( 5479478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik (const xmlChar *) val->value.str); 5480478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik } 5481478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik break; 54826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_TOKEN: 54836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_LANGUAGE: 54846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_NMTOKEN: 5485478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik case XML_SCHEMAS_NAME: 54866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_NCNAME: 54876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_ID: 54886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_IDREF: 54896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_ENTITY: 5490c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_NOTATION: /* Unclear */ 5491c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_ANYURI: /* Unclear */ 54926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (val->value.str == NULL) 5493478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik return (-1); 5494aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik *retValue = 5495aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik BAD_CAST xmlSchemaCollapseString(BAD_CAST val->value.str); 5496aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik if (*retValue == NULL) 5497aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik *retValue = 5498aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik BAD_CAST xmlStrdup((const xmlChar *) val->value.str); 5499478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik break; 5500478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik case XML_SCHEMAS_QNAME: 5501c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: Unclear in XML Schema 1.0. */ 5502478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (val->value.qname.uri == NULL) { 5503478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.qname.name); 5504478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik return (0); 5505478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik } else { 5506478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST "{"); 5507478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue), 5508478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik BAD_CAST val->value.qname.uri); 5509478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue), 5510478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik BAD_CAST "}"); 5511478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue), 5512478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik BAD_CAST val->value.qname.uri); 5513478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik } 5514478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik break; 5515c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_DECIMAL: 5516c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5517c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: Lookout for a more simple implementation. 5518c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5519c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((val->value.decimal.total == 1) && 5520c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik (val->value.decimal.lo == 0)) { 5521c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlStrdup(BAD_CAST "0.0"); 5522c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5523c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaValDecimal dec = val->value.decimal; 5524c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik int bufsize; 5525c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char *buf = NULL, *offs; 5526c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5527c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* Add room for the decimal point as well. */ 5528c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik bufsize = dec.total + 2; 5529c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.sign) 5530c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik bufsize++; 5531c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* Add room for leading/trailing zero. */ 5532c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((dec.frac == 0) || (dec.frac == dec.total)) 5533c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik bufsize++; 5534c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik buf = xmlMalloc(bufsize); 5535c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik offs = buf; 5536c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.sign) 5537c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *offs++ = '-'; 5538c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.frac == dec.total) { 5539c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *offs++ = '0'; 5540c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *offs++ = '.'; 5541c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5542c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.hi != 0) 5543c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(offs, bufsize - (offs - buf), 5544c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%lu%lu%lu", dec.hi, dec.mi, dec.lo); 5545c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else if (dec.mi != 0) 5546c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(offs, bufsize - (offs - buf), 5547c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%lu%lu", dec.mi, dec.lo); 5548c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 5549c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(offs, bufsize - (offs - buf), 5550c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%lu", dec.lo); 5551c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5552c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.frac != 0) { 5553c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.frac != dec.total) { 5554c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik int diff = dec.total - dec.frac; 5555c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5556c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Insert the decimal point. 5557c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5558c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik memmove(offs + diff + 1, offs + diff, dec.frac +1); 5559c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik offs[diff] = '.'; 5560c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5561c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik unsigned int i = 0; 5562c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5563c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Insert missing zeroes behind the decimal point. 5564c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5565c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik while (*(offs + i) != 0) 5566c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik i++; 5567c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (i < dec.total) { 5568c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik memmove(offs + (dec.total - i), offs, i +1); 5569c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik memset(offs, '0', dec.total - i); 5570c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5571c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5572c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5573c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5574c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Append decimal point and zero. 5575c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5576c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik offs = buf + bufsize - 1; 5577c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *offs-- = 0; 5578c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *offs-- = '0'; 5579c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *offs-- = '.'; 5580c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5581c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST buf; 5582c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5583c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5584c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_INTEGER: 5585c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_PINTEGER: 5586c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_NPINTEGER: 5587c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_NINTEGER: 5588c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_NNINTEGER: 5589c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_LONG: 5590c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_BYTE: 5591c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_SHORT: 5592c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_INT: 5593c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_UINT: 5594c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_ULONG: 5595c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_USHORT: 5596c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_UBYTE: 5597c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((val->value.decimal.total == 1) && 5598c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik (val->value.decimal.lo == 0)) 5599c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlStrdup(BAD_CAST "0"); 5600c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else { 5601c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaValDecimal dec = val->value.decimal; 5602c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik int bufsize = dec.total + 1; 5603c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5604c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* Add room for the decimal point as well. */ 5605c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.sign) 5606c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik bufsize++; 5607c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlMalloc(bufsize); 5608c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.hi != 0) { 5609c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.sign) 5610c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, bufsize, 5611c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "-%lu%lu%lu", dec.hi, dec.mi, dec.lo); 5612c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 5613c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, bufsize, 5614c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%lu%lu%lu", dec.hi, dec.mi, dec.lo); 5615c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else if (dec.mi != 0) { 5616c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.sign) 5617c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, bufsize, 5618c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "-%lu%lu", dec.mi, dec.lo); 5619c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 5620c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, bufsize, 5621c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%lu%lu", dec.mi, dec.lo); 5622c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5623c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.sign) 5624c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, bufsize, "-%lu", dec.lo); 5625c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 5626c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, bufsize, "%lu", dec.lo); 5627c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5628c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5629c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5630c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_BOOLEAN: 5631c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (val->value.b) 5632c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST "true"); 5633c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 5634c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST "false"); 5635c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5636c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_DURATION: { 5637c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[100]; 5638c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik unsigned long year; 5639c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik unsigned long mon, day, hour = 0, min = 0; 5640c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik double sec = 0, left; 5641c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5642c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: Unclear in XML Schema 1.0 */ 5643c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5644c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: This results in a normalized output of the value 5645c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * - which is NOT conformant to the spec - 5646c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * since the exact values of each property are not 5647c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * recoverable. Think about extending the structure to 5648c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * provide a field for every property. 5649c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5650c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik year = (unsigned long) FQUOTIENT(labs(val->value.dur.mon), 12); 5651c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik mon = labs(val->value.dur.mon) - 12 * year; 5652c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5653c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik day = (unsigned long) FQUOTIENT(fabs(val->value.dur.sec), 86400); 5654c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik left = fabs(val->value.dur.sec) - day * 86400; 5655c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (left > 0) { 5656c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik hour = (unsigned long) FQUOTIENT(left, 3600); 5657c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik left = left - (hour * 3600); 5658c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (left > 0) { 5659c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik min = (unsigned long) FQUOTIENT(left, 60); 5660c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik sec = left - (min * 60); 5661c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5662c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5663c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((val->value.dur.mon < 0) || (val->value.dur.sec < 0)) 5664c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 100, "P%luY%luM%luDT%luH%luM%.14gS", 5665c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik year, mon, day, hour, min, sec); 5666c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 5667c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 100, "-P%luY%luM%luDT%luH%luM%.14gS", 5668c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik year, mon, day, hour, min, sec); 5669c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 5670c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5671c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5672c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_GYEAR: { 5673c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[30]; 5674c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: Unclear in XML Schema 1.0 */ 5675c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: What to do with the timezone? */ 5676c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 30, "%04ld", val->value.date.year); 5677c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 5678c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5679c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5680c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_GMONTH: { 5681c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: Unclear in XML Schema 1.0 */ 5682c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: What to do with the timezone? */ 5683c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlMalloc(5); 5684c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, 6, "--%02u", 5685c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.mon); 5686c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5687c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5688c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_GDAY: { 5689c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: Unclear in XML Schema 1.0 */ 5690c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: What to do with the timezone? */ 5691c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlMalloc(6); 5692c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, 6, "---%02u", 5693c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.day); 5694c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5695c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5696c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_GMONTHDAY: { 5697c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: Unclear in XML Schema 1.0 */ 5698c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: What to do with the timezone? */ 5699c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlMalloc(8); 5700c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, 8, "--%02u-%02u", 5701c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.mon, val->value.date.day); 5702c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5703c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5704c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_GYEARMONTH: { 5705c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[35]; 5706c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: Unclear in XML Schema 1.0 */ 5707c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: What to do with the timezone? */ 5708c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (val->value.date.year < 0) 5709c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 35, "-%04ld-%02u", 5710c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik labs(val->value.date.year), 5711c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.mon); 5712c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 5713c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 35, "%04ld-%02u", 5714c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.year, val->value.date.mon); 5715c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 5716c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5717c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5718c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_TIME: 5719c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik { 5720c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[30]; 5721c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5722c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (val->value.date.tz_flag) { 5723c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaValPtr norm; 5724c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5725c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm = xmlSchemaDateNormalize(val, 0); 5726c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (norm == NULL) 5727c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (-1); 5728c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5729c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: Check if "%.14g" is portable. 5730c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5731c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 30, 5732c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%02u:%02u:%02.14gZ", 5733c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.hour, 5734c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.min, 5735c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.sec); 5736c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaFreeValue(norm); 5737c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5738c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 30, 5739c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%02u:%02u:%02.14g", 5740c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.hour, 5741c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.min, 5742c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.sec); 5743c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5744c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 5745c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5746c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5747c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_DATE: 5748c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik { 5749c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[30]; 5750c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5751c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (val->value.date.tz_flag) { 5752c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaValPtr norm; 5753c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5754c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm = xmlSchemaDateNormalize(val, 0); 5755c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (norm == NULL) 5756c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (-1); 5757c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5758c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: Append the canonical value of the 5759c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * recoverable timezone and not "Z". 5760c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5761c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 30, 5762c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%04ld:%02u:%02uZ", 5763c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.year, norm->value.date.mon, 5764c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.day); 5765c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaFreeValue(norm); 5766c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5767c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 30, 5768c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%04ld:%02u:%02u", 5769c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.year, val->value.date.mon, 5770c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.day); 5771c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5772c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 5773c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5774c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5775c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_DATETIME: 5776c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik { 5777c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[50]; 5778c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5779c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (val->value.date.tz_flag) { 5780c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaValPtr norm; 5781c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5782c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm = xmlSchemaDateNormalize(val, 0); 5783c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (norm == NULL) 5784c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (-1); 5785c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5786c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: Check if "%.14g" is portable. 5787c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5788c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 50, 5789c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%04ld:%02u:%02uT%02u:%02u:%02.14gZ", 5790c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.year, norm->value.date.mon, 5791c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.day, norm->value.date.hour, 5792c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.min, norm->value.date.sec); 5793c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaFreeValue(norm); 5794c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5795c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 50, 5796c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%04ld:%02u:%02uT%02u:%02u:%02.14g", 5797c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.year, val->value.date.mon, 5798c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.day, val->value.date.hour, 5799c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.min, val->value.date.sec); 5800c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5801c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 5802c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5803c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5804c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_HEXBINARY: 5805c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.hex.str); 5806c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5807c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_BASE64BINARY: 5808c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5809c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: Is the following spec piece implemented?: 5810c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * SPEC: "Note: For some values the canonical form defined 5811c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * above does not conform to [RFC 2045], which requires breaking 5812c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * with linefeeds at appropriate intervals." 5813c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5814c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.base64.str); 5815c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5816c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_FLOAT: { 5817c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[30]; 5818c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5819c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * |m| < 16777216, -149 <= e <= 104. 5820c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: Handle, NaN, INF, -INF. The format is not 5821c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * yet conformant. The c type float does not cover 5822c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * the whole range. 5823c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5824c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 30, "%01.14e", val->value.f); 5825c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 5826c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5827c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5828c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_DOUBLE: { 5829c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[40]; 5830c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* |m| < 9007199254740992, -1075 <= e <= 970 */ 5831c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5832c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: Handle, NaN, INF, -INF. The format is not 5833c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * yet conformant. The c type float does not cover 5834c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * the whole range. 5835c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5836c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 40, "%01.14e", val->value.d); 5837c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 5838c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5839c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 58406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik default: 5841478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST "???"); 5842c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (1); 58436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 5844478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik return (0); 5845478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik} 5846478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik 5847bda59576670f1cabea3c49520628d82e401702caDaniel Veillard/** 5848c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * xmlSchemaGetCanonValueWhtsp: 5849c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @val: the precomputed value 5850c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @retValue: the returned value 5851c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @ws: the whitespace type of the value 5852c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * 5853c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Get a the cononical representation of the value. 5854c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * The caller has to free the returned @retValue. 5855c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * 5856c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Returns 0 if the value could be built, 1 if the value type is 5857c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * not supported yet and -1 in case of API errors. 5858c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5859c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcikint 5860c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. BuchcikxmlSchemaGetCanonValueWhtsp(xmlSchemaValPtr val, 5861c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik const xmlChar **retValue, 5862c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaWhitespaceValueType ws) 5863c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik{ 5864c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((retValue == NULL) || (val == NULL)) 5865c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (-1); 5866c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((ws == XML_SCHEMA_WHITESPACE_UNKNOWN) || 5867c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik (ws > XML_SCHEMA_WHITESPACE_COLLAPSE)) 5868c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (-1); 5869c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5870c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = NULL; 5871c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik switch (val->type) { 5872c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_STRING: 5873c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (val->value.str == NULL) 5874c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST ""); 5875c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) 5876c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlSchemaCollapseString(val->value.str); 5877c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else if (ws == XML_SCHEMA_WHITESPACE_REPLACE) 5878c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlSchemaWhiteSpaceReplace(val->value.str); 5879c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((*retValue) == NULL) 5880c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(val->value.str); 5881c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5882c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_NORMSTRING: 5883c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (val->value.str == NULL) 5884c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST ""); 5885c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else { 5886c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) 5887c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlSchemaCollapseString(val->value.str); 5888c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 5889c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlSchemaWhiteSpaceReplace(val->value.str); 5890c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((*retValue) == NULL) 5891c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(val->value.str); 5892c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5893c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5894c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik default: 5895c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (xmlSchemaGetCanonValue(val, retValue)); 5896c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5897c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (0); 5898c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik} 5899c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5900c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik/** 5901bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * xmlSchemaGetValType: 5902bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * @val: a schemas value 5903bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * 5904bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * Accessor for the type of a value 5905bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * 5906bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * Returns the xmlSchemaValType of the value 5907bda59576670f1cabea3c49520628d82e401702caDaniel Veillard */ 5908478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaValType 5909478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaGetValType(xmlSchemaValPtr val) 5910478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{ 5911bda59576670f1cabea3c49520628d82e401702caDaniel Veillard if (val == NULL) 5912bda59576670f1cabea3c49520628d82e401702caDaniel Veillard return(XML_SCHEMAS_UNKNOWN); 5913478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik return (val->type); 59146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 59156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 59165d4644ef6e38479a648615eca758c5e962a141d5Daniel Veillard#define bottom_xmlschemastypes 59175d4644ef6e38479a648615eca758c5e962a141d5Daniel Veillard#include "elfgcchack.h" 59184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#endif /* LIBXML_SCHEMAS_ENABLED */ 5919