xmlschemastypes.c revision e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2
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 31070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 324255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#define DEBUG 334255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 344255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#define TODO \ 354255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlGenericError(xmlGenericErrorContext, \ 364255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard "Unimplemented block at %s:%d\n", \ 374255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard __FILE__, __LINE__); 384255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 394255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#define XML_SCHEMAS_NAMESPACE_NAME \ 404255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard (const xmlChar *)"http://www.w3.org/2001/XMLSchema" 414255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 424255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardtypedef enum { 434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard XML_SCHEMAS_UNKNOWN = 0, 444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard XML_SCHEMAS_STRING, 458bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard XML_SCHEMAS_NORMSTRING, 464255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard XML_SCHEMAS_DECIMAL, 47070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard XML_SCHEMAS_TIME, 48070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard XML_SCHEMAS_GDAY, 49070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard XML_SCHEMAS_GMONTH, 50070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard XML_SCHEMAS_GMONTHDAY, 51070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard XML_SCHEMAS_GYEAR, 52070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard XML_SCHEMAS_GYEARMONTH, 53070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard XML_SCHEMAS_DATE, 54070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard XML_SCHEMAS_DATETIME, 55070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard XML_SCHEMAS_DURATION, 5684d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillard XML_SCHEMAS_FLOAT, 5784d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillard XML_SCHEMAS_DOUBLE, 58c5a70f264550ee39da267e81dccd95508ed367ddDaniel Veillard XML_SCHEMAS_BOOLEAN, 598bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard XML_SCHEMAS_TOKEN, 608bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard XML_SCHEMAS_LANGUAGE, 618bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard XML_SCHEMAS_NMTOKEN, 628bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard XML_SCHEMAS_NMTOKENS, 638bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard XML_SCHEMAS_NAME, 648bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard XML_SCHEMAS_QNAME, 658bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard XML_SCHEMAS_NCNAME, 668bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard XML_SCHEMAS_ID, 678bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard XML_SCHEMAS_IDREF, 688bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard XML_SCHEMAS_IDREFS, 698bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard XML_SCHEMAS_ENTITY, 708bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard XML_SCHEMAS_ENTITIES, 718bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard XML_SCHEMAS_NOTATION, 728bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard XML_SCHEMAS_ANYURI, 738bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard XML_SCHEMAS_INTEGER, 748bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard XML_SCHEMAS_NPINTEGER, 758bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard XML_SCHEMAS_NINTEGER, 768bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard XML_SCHEMAS_NNINTEGER, 778bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard XML_SCHEMAS_PINTEGER, 7896a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard XML_SCHEMAS_INT, 798bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard XML_SCHEMAS_UINT, 808bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard XML_SCHEMAS_LONG, 818bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard XML_SCHEMAS_ULONG, 828bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard XML_SCHEMAS_SHORT, 838bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard XML_SCHEMAS_USHORT, 848bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard XML_SCHEMAS_BYTE, 858bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard XML_SCHEMAS_UBYTE 864255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} xmlSchemaValType; 874255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 885f704afe98c584b7188aa0e4fbc9d9e68e0d7b1bDaniel Veillardstatic unsigned long powten[10] = { 894255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000L, 904255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 100000000L, 1000000000L 914255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}; 924255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 93070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* Date value */ 94070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef struct _xmlSchemaValDate xmlSchemaValDate; 95070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef xmlSchemaValDate *xmlSchemaValDatePtr; 96070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstruct _xmlSchemaValDate { 97070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard long year; 98070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard unsigned int mon :4; /* 1 <= mon <= 12 */ 99070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard unsigned int day :5; /* 1 <= day <= 31 */ 100070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard unsigned int hour :5; /* 0 <= hour <= 23 */ 101070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard unsigned int min :6; /* 0 <= min <= 59 */ 102070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard double sec; 103070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int tz_flag :1; /* is tzo explicitely set? */ 104070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int tzo :11; /* -1440 <= tzo <= 1440 */ 105070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}; 106070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 107070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* Duration value */ 108070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef struct _xmlSchemaValDuration xmlSchemaValDuration; 109070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef xmlSchemaValDuration *xmlSchemaValDurationPtr; 110070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstruct _xmlSchemaValDuration { 111070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard long mon; /* mon stores years also */ 112070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard long day; 113070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard double sec; /* sec stores min and hour also */ 114070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}; 115070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardtypedef struct _xmlSchemaValDecimal xmlSchemaValDecimal; 1174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardtypedef xmlSchemaValDecimal *xmlSchemaValDecimalPtr; 1184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstruct _xmlSchemaValDecimal { 1194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard /* would use long long but not portable */ 120e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard unsigned long lo; 121e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard unsigned long mi; 122e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard unsigned long hi; 1234255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard unsigned int extra; 1245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard unsigned int sign:1; 1254255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard int frac:7; 1264255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard int total:8; 1274255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}; 1284255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 129e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardtypedef struct _xmlSchemaValQName xmlSchemaValQName; 130e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardtypedef xmlSchemaValQName *xmlSchemaValQNamePtr; 131e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardstruct _xmlSchemaValQName { 132e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard xmlChar *name; 133e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard xmlChar *uri; 134e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard}; 135e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard 1364255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstruct _xmlSchemaVal { 1374255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaValType type; 1384255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard union { 1395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValDecimal decimal; 140070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaValDate date; 141070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaValDuration dur; 142e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard xmlSchemaValQName qname; 14384d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillard float f; 14484d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillard double d; 145c5a70f264550ee39da267e81dccd95508ed367ddDaniel Veillard int b; 146c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard xmlChar *str; 1474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } value; 1484255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}; 1494255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 1504255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic int xmlSchemaTypesInitialized = 0; 1514255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlHashTablePtr xmlSchemaTypesBank = NULL; 1524255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 153c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard/* 154c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard * Basic types 155c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard */ 1564255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeStringDef = NULL; 1574255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeAnyTypeDef = NULL; 1584255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeAnySimpleTypeDef = NULL; 1594255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDecimalDef = NULL; 160070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDatetimeDef = NULL; 1614255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDateDef = NULL; 162070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeTimeDef = NULL; 163070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGYearDef = NULL; 164070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGYearMonthDef = NULL; 165070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGDayDef = NULL; 166070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGMonthDayDef = NULL; 167070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGMonthDef = NULL; 168070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDurationDef = NULL; 16984d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeFloatDef = NULL; 170c5a70f264550ee39da267e81dccd95508ed367ddDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeBooleanDef = NULL; 17184d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDoubleDef = NULL; 172e5b110b3844d58ff4bea56bcb699144f6fbe0b83Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeAnyURIDef = NULL; 1734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 1744255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/* 175c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard * Derived types 176c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard */ 177c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypePositiveIntegerDef = NULL; 178c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNonPositiveIntegerDef = NULL; 179c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNegativeIntegerDef = NULL; 180c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNonNegativeIntegerDef = NULL; 181c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIntegerDef = NULL; 182c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeLongDef = NULL; 183c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIntDef = NULL; 184c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeShortDef = NULL; 185c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeByteDef = NULL; 186c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedLongDef = NULL; 187c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedIntDef = NULL; 188c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedShortDef = NULL; 189c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedByteDef = NULL; 1908bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNormStringDef = NULL; 1918bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeTokenDef = NULL; 1928bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeLanguageDef = NULL; 1938bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNameDef = NULL; 1948bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeQNameDef = NULL; 195e5b110b3844d58ff4bea56bcb699144f6fbe0b83Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNCNameDef = NULL; 1968bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIdDef = NULL; 1978bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIdrefDef = NULL; 1988bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIdrefsDef = NULL; 199a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeEntityDef = NULL; 200a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeEntitiesDef = NULL; 201e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNotationDef = NULL; 2028bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNmtokenDef = NULL; 2038bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNmtokensDef = NULL; 204c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard 205c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard/* 2064255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaInitBasicType: 2074255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @name: the type name 2088bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard * @type: the value type associated 2094255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 2104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Initialize one default type 2114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 2124255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr 2138bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel VeillardxmlSchemaInitBasicType(const char *name, xmlSchemaValType type) { 2144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaTypePtr ret; 2154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 2164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard ret = (xmlSchemaTypePtr) xmlMalloc(sizeof(xmlSchemaType)); 2174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (ret == NULL) { 2184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlGenericError(xmlGenericErrorContext, 2194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard "Could not initilize type %s: out of memory\n", name); 2204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(NULL); 2214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 2224255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard memset(ret, 0, sizeof(xmlSchemaType)); 2234255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard ret->name = xmlStrdup((const xmlChar *)name); 2244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard ret->type = XML_SCHEMA_TYPE_BASIC; 2258bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard ret->flags = type; 2264255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard ret->contentType = XML_SCHEMA_CONTENT_BASIC; 2274255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlHashAddEntry2(xmlSchemaTypesBank, ret->name, 2284255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard XML_SCHEMAS_NAMESPACE_NAME, ret); 2294255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(ret); 2304255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 2314255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 2324255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/* 2334255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaInitTypes: 2344255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 2354255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Initialize the default XML Schemas type library 2364255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 2374255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid 2386560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel VeillardxmlSchemaInitTypes(void) 2396560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard{ 2404255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (xmlSchemaTypesInitialized != 0) 2416560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard return; 2424255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaTypesBank = xmlHashCreate(40); 2436560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard 244c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard /* 245c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard * primitive datatypes 246c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard */ 2478bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeStringDef = xmlSchemaInitBasicType("string", 2486560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard XML_SCHEMAS_STRING); 2498bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeAnyTypeDef = xmlSchemaInitBasicType("anyType", 2506560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard XML_SCHEMAS_UNKNOWN); 2518bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeAnySimpleTypeDef = xmlSchemaInitBasicType("anySimpleType", 2526560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard XML_SCHEMAS_UNKNOWN); 2538bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeDecimalDef = xmlSchemaInitBasicType("decimal", 2546560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard XML_SCHEMAS_DECIMAL); 2558bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeDateDef = xmlSchemaInitBasicType("date", 2566560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard XML_SCHEMAS_DATE); 2578bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeDatetimeDef = xmlSchemaInitBasicType("dateTime", 2586560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard XML_SCHEMAS_DATETIME); 2598bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeTimeDef = xmlSchemaInitBasicType("time", 2606560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard XML_SCHEMAS_TIME); 2618bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeGYearDef = xmlSchemaInitBasicType("gYear", 2626560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard XML_SCHEMAS_GYEAR); 2638bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeGYearMonthDef = xmlSchemaInitBasicType("gYearMonth", 2646560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard XML_SCHEMAS_GYEARMONTH); 2658bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeGMonthDef = xmlSchemaInitBasicType("gMonth", 2666560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard XML_SCHEMAS_GMONTH); 2678bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeGMonthDayDef = xmlSchemaInitBasicType("gMonthDay", 2686560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard XML_SCHEMAS_GMONTHDAY); 2698bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeGDayDef = xmlSchemaInitBasicType("gDay", 2706560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard XML_SCHEMAS_GDAY); 2718bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeDurationDef = xmlSchemaInitBasicType("duration", 2726560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard XML_SCHEMAS_DURATION); 2738bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeFloatDef = xmlSchemaInitBasicType("float", 2746560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard XML_SCHEMAS_FLOAT); 2758bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeDoubleDef = xmlSchemaInitBasicType("double", 2766560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard XML_SCHEMAS_DOUBLE); 2778bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeBooleanDef = xmlSchemaInitBasicType("boolean", 2786560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard XML_SCHEMAS_BOOLEAN); 2798bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeAnyURIDef = xmlSchemaInitBasicType("anyURI", 2806560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard XML_SCHEMAS_ANYURI); 2814255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 282c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard /* 283c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard * derived datatypes 284c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard */ 2858bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeIntegerDef = xmlSchemaInitBasicType("integer", 2866560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard XML_SCHEMAS_INTEGER);; 2876560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeNonPositiveIntegerDef = 2886560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaInitBasicType("nonPositiveInteger", 2896560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard XML_SCHEMAS_NPINTEGER);; 2906560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeNegativeIntegerDef = 2916560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaInitBasicType("negativeInteger", XML_SCHEMAS_NINTEGER);; 2926560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeLongDef = 2936560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaInitBasicType("long", XML_SCHEMAS_LONG);; 2946560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeIntDef = xmlSchemaInitBasicType("int", XML_SCHEMAS_INT);; 2958bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeShortDef = xmlSchemaInitBasicType("short", 2966560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard XML_SCHEMAS_SHORT);; 2978bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeByteDef = xmlSchemaInitBasicType("byte", 2986560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard XML_SCHEMAS_BYTE);; 2996560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeNonNegativeIntegerDef = 3006560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaInitBasicType("nonNegativeInteger", 3016560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard XML_SCHEMAS_NNINTEGER); 3026560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeUnsignedLongDef = 3036560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaInitBasicType("unsignedLong", XML_SCHEMAS_ULONG);; 3046560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeUnsignedIntDef = 3056560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaInitBasicType("unsignedInt", XML_SCHEMAS_UINT);; 3066560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeUnsignedShortDef = 307e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard xmlSchemaInitBasicType("unsignedShort", XML_SCHEMAS_USHORT);; 3086560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeUnsignedByteDef = 3096560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaInitBasicType("unsignedByte", XML_SCHEMAS_UBYTE);; 3106560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypePositiveIntegerDef = 3116560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaInitBasicType("positiveInteger", XML_SCHEMAS_PINTEGER); 3128bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard 3138bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeNormStringDef = xmlSchemaInitBasicType("normalizedString", 3146560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard XML_SCHEMAS_NORMSTRING); 3158bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeTokenDef = xmlSchemaInitBasicType("token", 3166560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard XML_SCHEMAS_TOKEN); 3178bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeLanguageDef = xmlSchemaInitBasicType("language", 3186560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard XML_SCHEMAS_LANGUAGE); 3196560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeIdDef = xmlSchemaInitBasicType("ID", XML_SCHEMAS_ID); 3208bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeIdrefDef = xmlSchemaInitBasicType("IDREF", 3216560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard XML_SCHEMAS_IDREF); 3228bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeIdrefsDef = xmlSchemaInitBasicType("IDREFS", 3236560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard XML_SCHEMAS_IDREFS); 324a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard xmlSchemaTypeEntityDef = xmlSchemaInitBasicType("ENTITY", 3256560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard XML_SCHEMAS_ENTITY); 326a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard xmlSchemaTypeEntitiesDef = xmlSchemaInitBasicType("ENTITIES", 3276560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard XML_SCHEMAS_ENTITIES); 328e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard xmlSchemaTypeNotationDef = xmlSchemaInitBasicType("NOTATION", 329e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard XML_SCHEMAS_NOTATION); 3308bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeNameDef = xmlSchemaInitBasicType("Name", 3316560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard XML_SCHEMAS_NAME); 3328bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeQNameDef = xmlSchemaInitBasicType("QName", 3336560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard XML_SCHEMAS_QNAME); 3348bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeNCNameDef = xmlSchemaInitBasicType("NCName", 3356560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard XML_SCHEMAS_NCNAME); 3368bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeNmtokenDef = xmlSchemaInitBasicType("NMTOKEN", 3376560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard XML_SCHEMAS_NMTOKEN); 3388bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeNmtokensDef = xmlSchemaInitBasicType("NMTOKENS", 3396560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard XML_SCHEMAS_NMTOKENS); 3404255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaTypesInitialized = 1; 3414255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 3424255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 3434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 3444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCleanupTypes: 3454255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 3464255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Cleanup the default XML Schemas type library 3474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 3484255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid 3494255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaCleanupTypes(void) { 3504255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (xmlSchemaTypesInitialized == 0) 3514255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return; 3524255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlHashFree(xmlSchemaTypesBank, (xmlHashDeallocator) xmlSchemaFreeType); 3534255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaTypesInitialized = 0; 3544255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 3554255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 3564255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 3574255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaNewValue: 3584255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @type: the value type 3594255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 3604255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Allocate a new simple type value 3614255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 3624255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns a pointer to the new value or NULL in case of error 3634255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 3644255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaValPtr 3654255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaNewValue(xmlSchemaValType type) { 3664255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaValPtr value; 3674255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 3684255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard value = (xmlSchemaValPtr) xmlMalloc(sizeof(xmlSchemaVal)); 3694255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (value == NULL) { 3704255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(NULL); 3714255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 3724255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard memset(value, 0, sizeof(xmlSchemaVal)); 3734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard value->type = type; 3744255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(value); 3754255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 3764255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 3774255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 3784255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaFreeValue: 3794255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value: the value to free 3804255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 3814255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Cleanup the default XML Schemas type library 3824255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 3834255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid 3844255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaFreeValue(xmlSchemaValPtr value) { 3854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (value == NULL) 3864255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return; 387c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard switch (value->type) { 388c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_STRING: 389c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_NORMSTRING: 390c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_TOKEN: 391c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_LANGUAGE: 392c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_NMTOKEN: 393c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_NMTOKENS: 394c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_NAME: 395c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_NCNAME: 396c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_ID: 397c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_IDREF: 398c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_IDREFS: 399c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_ENTITY: 400c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_ENTITIES: 401c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_NOTATION: 402c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_ANYURI: 403c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (value->value.str != NULL) 404c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard xmlFree(value->value.str); 405c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard break; 406e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_QNAME: 407e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (value->value.qname.uri != NULL) 408e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard xmlFree(value->value.qname.uri); 409e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (value->value.qname.name != NULL) 410e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard xmlFree(value->value.qname.name); 411e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard break; 412c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard default: 413c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard break; 414c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlFree(value); 4164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 4174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 4184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 4194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaGetPredefinedType: 4204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @name: the type name 4214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @ns: the URI of the namespace usually "http://www.w3.org/2001/XMLSchema" 4224255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 4234255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Lookup a type in the default XML Schemas type library 4244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 4254255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns the type if found, NULL otherwise 4264255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 4274255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaTypePtr 4284255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaGetPredefinedType(const xmlChar *name, const xmlChar *ns) { 4294255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (xmlSchemaTypesInitialized == 0) 4304255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaInitTypes(); 4314255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (name == NULL) 4324255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(NULL); 4334255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return((xmlSchemaTypePtr) xmlHashLookup2(xmlSchemaTypesBank, name, ns)); 4344255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 435070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 436070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**************************************************************** 437070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * * 438070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Convenience macros and functions * 439070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * * 440070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ****************************************************************/ 441070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 442070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define IS_TZO_CHAR(c) \ 443070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ((c == 0) || (c == 'Z') || (c == '+') || (c == '-')) 444070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 445070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_YEAR(yr) (yr != 0) 446070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MONTH(mon) ((mon >= 1) && (mon <= 12)) 447070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* VALID_DAY should only be used when month is unknown */ 448070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DAY(day) ((day >= 1) && (day <= 31)) 449070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_HOUR(hr) ((hr >= 0) && (hr <= 23)) 450070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MIN(min) ((min >= 0) && (min <= 59)) 451070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_SEC(sec) ((sec >= 0) && (sec < 60)) 452070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_TZO(tzo) ((tzo > -1440) && (tzo < 1440)) 453070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define IS_LEAP(y) \ 454070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)) 455070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 456070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic const long daysInMonth[12] = 457070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; 458070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic const long daysInMonthLeap[12] = 459070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; 460070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 4615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MAX_DAYINMONTH(yr,mon) \ 4625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (IS_LEAP(yr) ? daysInMonthLeap[mon - 1] : daysInMonth[mon - 1]) 4635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 464070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MDAY(dt) \ 465070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (IS_LEAP(dt->year) ? \ 466070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (dt->day <= daysInMonthLeap[dt->mon - 1]) : \ 467070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (dt->day <= daysInMonth[dt->mon - 1])) 468070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 469070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DATE(dt) \ 470070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (VALID_YEAR(dt->year) && VALID_MONTH(dt->mon) && VALID_MDAY(dt)) 471070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 472070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_TIME(dt) \ 473070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (VALID_HOUR(dt->hour) && VALID_MIN(dt->min) && \ 474070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard VALID_SEC(dt->sec) && VALID_TZO(dt->tzo)) 475070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 476070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DATETIME(dt) \ 477070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (VALID_DATE(dt) && VALID_TIME(dt)) 478070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 479070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_MIN (60) 480070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_HOUR (60 * SECS_PER_MIN) 481070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_DAY (24 * SECS_PER_HOUR) 482070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 4835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic const long dayInYearByMonth[12] = 4845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }; 4855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic const long dayInLeapYearByMonth[12] = 4865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 }; 4875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 4885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DAY_IN_YEAR(day, month, year) \ 4895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ((IS_LEAP(year) ? \ 4905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dayInLeapYearByMonth[month - 1] : \ 4915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dayInYearByMonth[month - 1]) + day) 4925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 4935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#ifdef DEBUG 4945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DEBUG_DATE(dt) \ 4955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlGenericError(xmlGenericErrorContext, \ 4965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard "type=%o %04ld-%02u-%02uT%02u:%02u:%03f", \ 4975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dt->type,dt->value.date.year,dt->value.date.mon, \ 4985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dt->value.date.day,dt->value.date.hour,dt->value.date.min, \ 4995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dt->value.date.sec); \ 5005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dt->value.date.tz_flag) \ 5015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dt->value.date.tzo != 0) \ 5025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlGenericError(xmlGenericErrorContext, \ 5035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard "%+05d\n",dt->value.date.tzo); \ 5045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else \ 5055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlGenericError(xmlGenericErrorContext, "Z\n"); \ 5065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else \ 5075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlGenericError(xmlGenericErrorContext,"\n") 5085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#else 5095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DEBUG_DATE(dt) 5105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#endif 5115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 512070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 513070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGYear: 514070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 515070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 516070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 517070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gYear without time zone and fills in the appropriate 518070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the 519070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gYear. It is supposed that @dt->year is big enough to contain 520070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * the year. 521070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 522070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 523070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 524070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 525070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGYear (xmlSchemaValDatePtr dt, const xmlChar **str) { 526070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = *str, *firstChar; 527070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int isneg = 0, digcnt = 0; 528070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 529070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (((*cur < '0') || (*cur > '9')) && 530070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (*cur != '-') && (*cur != '+')) 531070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 532070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 533070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == '-') { 534070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard isneg = 1; 535070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 536070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 537070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 538070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard firstChar = cur; 539070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 540070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { 541070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->year = dt->year * 10 + (*cur - '0'); 542070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 543070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard digcnt++; 544070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 545070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 546070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* year must be at least 4 digits (CCYY); over 4 547070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * digits cannot have a leading zero. */ 548070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((digcnt < 4) || ((digcnt > 4) && (*firstChar == '0'))) 549070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 550070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 551070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (isneg) 552070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->year = - dt->year; 553070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 554070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_YEAR(dt->year)) 555070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 556070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 557070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 558070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 559070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 560070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 561070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 562070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_2_DIGITS: 563070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num: the integer to fill in 564070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur: an #xmlChar * 565070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @invalid: an integer 566070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 567070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a 2-digits integer and updates @num with the value. @cur is 568070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the integer. 569070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @invalid is set to %TRUE, values of @num and 570070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined. 571070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 572070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_2_DIGITS(num, cur, invalid) \ 573070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((cur[0] < '0') || (cur[0] > '9') || \ 574070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (cur[1] < '0') || (cur[1] > '9')) \ 575070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard invalid = 1; \ 576070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else \ 577070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num = (cur[0] - '0') * 10 + (cur[1] - '0'); \ 578070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur += 2; 579070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 580070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 581070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_FLOAT: 582070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num: the double to fill in 583070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur: an #xmlChar * 584070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @invalid: an integer 585070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 586070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a float and updates @num with the value. @cur is 587070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the float. The float must have a 588070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 2-digits integer part and may or may not have a decimal part. 589070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @invalid is set to %TRUE, values of @num and 590070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined. 591070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 592070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_FLOAT(num, cur, invalid) \ 593070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(num, cur, invalid); \ 594070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!invalid && (*cur == '.')) { \ 595070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard double mult = 1; \ 596070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 597070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur < '0') || (*cur > '9')) \ 598070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard invalid = 1; \ 599070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { \ 600070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard mult /= 10; \ 601070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num += (*cur - '0') * mult; \ 602070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 603070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } \ 604070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 605070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 606070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 607070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGMonth: 608070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 609070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 610070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 611070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gMonth without time zone and fills in the appropriate 612070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the 613070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gMonth. 614070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 615070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 616070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 617070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 618070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGMonth (xmlSchemaValDatePtr dt, const xmlChar **str) { 619070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = *str; 620070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret = 0; 621070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 622070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(dt->mon, cur, ret); 623070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 624070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 625070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 626070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_MONTH(dt->mon)) 627070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 628070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 629070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 630070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 631070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 632070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 633070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 634070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGDay: 635070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 636070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 637070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 638070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gDay without time zone and fills in the appropriate 639070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the 640070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gDay. 641070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 642070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 643070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 644070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 645070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGDay (xmlSchemaValDatePtr dt, const xmlChar **str) { 646070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = *str; 647070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret = 0; 648070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 649070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(dt->day, cur, ret); 650070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 651070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 652070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 653070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_DAY(dt->day)) 654070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 655070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 656070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 657070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 658070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 659070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 660070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 661070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseTime: 662070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 663070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 664070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 665070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:time without time zone and fills in the appropriate 666070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * fields of the @dt structure. @str is updated to point just after the 667070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:time. 668070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, values of @dt fields are undefined. 669070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 670070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 671070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 672070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 673070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseTime (xmlSchemaValDatePtr dt, const xmlChar **str) { 674070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = *str; 675070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard unsigned int hour = 0; /* use temp var in case str is not xs:time */ 676070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret = 0; 677070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 678070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(hour, cur, ret); 679070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 680070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 681070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 682070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != ':') 683070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 684070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 685070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 686070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* the ':' insures this string is xs:time */ 687070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->hour = hour; 688070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 689070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(dt->min, cur, ret); 690070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 691070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 692070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 693070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != ':') 694070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 695070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 696070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 697070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_FLOAT(dt->sec, cur, ret); 698070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 699070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 700070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 701070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_TIME(dt)) 702070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 703070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 704070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 705070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 706070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 707070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 708070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 709070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseTimeZone: 710070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 711070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 712070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 713070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a time zone without time zone and fills in the appropriate 714070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the 715070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * time zone. 716070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 717070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 718070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 719070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 720070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseTimeZone (xmlSchemaValDatePtr dt, const xmlChar **str) { 721070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = *str; 722070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret = 0; 723070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 724070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (str == NULL) 725070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 726070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 727070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard switch (*cur) { 728070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case 0: 729070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tz_flag = 0; 730070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo = 0; 731070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 732070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 733070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case 'Z': 734070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tz_flag = 1; 735070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo = 0; 736070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 737070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 738070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 739070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case '+': 740070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case '-': { 741070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int isneg = 0, tmp = 0; 742070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard isneg = (*cur == '-'); 743070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 744070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 745070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 746070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(tmp, cur, ret); 747070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 748070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 749070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_HOUR(tmp)) 750070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 751070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 752070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != ':') 753070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 754070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 755070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 756070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo = tmp * 60; 757070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 758070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(tmp, cur, ret); 759070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 760070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 761070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_MIN(tmp)) 762070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 763070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 764070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo += tmp; 765070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (isneg) 766070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo = - dt->tzo; 767070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 768070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_TZO(dt->tzo)) 769070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 770070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 7715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dt->tz_flag = 1; 772070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 773070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 774070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard default: 775070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 776070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 777070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 778070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 779070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 780070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 781070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 782070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**************************************************************** 783070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * * 784070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * XML Schema Dates/Times Datatypes Handling * 785070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * * 786070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ****************************************************************/ 787070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 788070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 789070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_DIGITS: 790070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num: the integer to fill in 791070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur: an #xmlChar * 792070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num_type: an integer flag 793070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 794070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a digits integer and updates @num with the value. @cur is 795070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the integer. 796070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @num_type is set to -1, values of @num and 797070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined. 798070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 799070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_DIGITS(num, cur, num_type) \ 800070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur < '0') || (*cur > '9')) \ 801070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num_type = -1; \ 802070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else \ 803070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { \ 804070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num = num * 10 + (*cur - '0'); \ 805070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 806070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 807070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 808070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 809070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_NUM: 810070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num: the double to fill in 811070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur: an #xmlChar * 812070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num_type: an integer flag 813070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 814070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a float or integer and updates @num with the value. @cur is 815070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the number. If the number is a float, 816070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * then it must have an integer part and a decimal part; @num_type will 817070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * be set to 1. If there is no decimal part, @num_type is set to zero. 818070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @num_type is set to -1, values of @num and 819070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined. 820070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 821070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_NUM(num, cur, num_type) \ 822070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num = 0; \ 823070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_DIGITS(num, cur, num_type); \ 824070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!num_type && (*cur == '.')) { \ 825070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard double mult = 1; \ 826070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 827070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur < '0') || (*cur > '9')) \ 828070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num_type = -1; \ 829070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else \ 830070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num_type = 1; \ 831070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { \ 832070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard mult /= 10; \ 833070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num += (*cur - '0') * mult; \ 834070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 835070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } \ 836070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 837070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 838070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 8395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaValidateDates: 840070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @type: the predefined type 841070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dateTime: string to analyze 842070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @val: the return computed value 843070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 844070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Check that @dateTime conforms to the lexical space of one of the date types. 845070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * if true a value is computed and returned in @val. 846070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 847070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 848070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * and -1 in case of internal or API error. 849070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 850070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 851dda8f1ba9fb2e731e2dd6aa325ed07add7905ec3Daniel VeillardxmlSchemaValidateDates (xmlSchemaTypePtr type ATTRIBUTE_UNUSED, 852118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard const xmlChar *dateTime, xmlSchemaValPtr *val) { 853070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaValPtr dt; 854070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret; 855070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = dateTime; 856070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 857070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define RETURN_TYPE_IF_VALID(t) \ 858070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (IS_TZO_CHAR(*cur)) { \ 859070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur); \ 860070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == 0) { \ 861070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != 0) \ 862070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; \ 863070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->type = t; \ 864070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (val != NULL) \ 865070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *val = dt; \ 86680b19092f24410a6b869abf519227686e8f207caDaniel Veillard else \ 86780b19092f24410a6b869abf519227686e8f207caDaniel Veillard xmlSchemaFreeValue(dt); \ 868070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; \ 869070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } \ 870070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 871070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 872070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dateTime == NULL) 873070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 874070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 875070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur != '-') && (*cur < '0') && (*cur > '9')) 876070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 877070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 878070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt = xmlSchemaNewValue(XML_SCHEMAS_UNKNOWN); 879070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dt == NULL) 880070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 881070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 882070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((cur[0] == '-') && (cur[1] == '-')) { 883070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* 884070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * It's an incomplete date (xs:gMonthDay, xs:gMonth or 885070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gDay) 886070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 887070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur += 2; 888070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 889070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* is it an xs:gDay? */ 890070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == '-') { 891070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ++cur; 892070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGDay(&(dt->value.date), &cur); 893070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 894070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 895070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 896070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GDAY); 897070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 898070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 899070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 900070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 901070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* 902070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * it should be an xs:gMonthDay or xs:gMonth 903070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 904070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur); 905070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 906070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 907070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 908070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != '-') 909070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 910070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 911070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 912070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* is it an xs:gMonth? */ 913070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == '-') { 914070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 915070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTH); 916070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 917070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 918070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 919070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* it should be an xs:gMonthDay */ 920070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGDay(&(dt->value.date), &cur); 921070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 922070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 923070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 924070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTHDAY); 925070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 926070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 927070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 928070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 929070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* 930070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * It's a right-truncated date or an xs:time. 931070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Try to parse an xs:time then fallback on right-truncated dates. 932070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 933070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur >= '0') && (*cur <= '9')) { 934070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseTime(&(dt->value.date), &cur); 935070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == 0) { 936070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* it's an xs:time */ 937070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_TIME); 938070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 939070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 940070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 941070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* fallback on date parsing */ 942070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur = dateTime; 943070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 944070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGYear(&(dt->value.date), &cur); 945070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 946070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 947070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 948070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* is it an xs:gYear? */ 949070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEAR); 950070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 951070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != '-') 952070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 953070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 954070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 955070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur); 956070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 957070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 958070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 959070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* is it an xs:gYearMonth? */ 960070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEARMONTH); 961070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 962070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != '-') 963070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 964070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 965070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 966070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGDay(&(dt->value.date), &cur); 967070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((ret != 0) || !VALID_DATE((&(dt->value.date)))) 968070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 969070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 970070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* is it an xs:date? */ 971070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_DATE); 972070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 973070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != 'T') 974070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 975070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 976070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 977070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* it should be an xs:dateTime */ 978070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseTime(&(dt->value.date), &cur); 979070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 980070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 981070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 982070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur); 983070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((ret != 0) || (*cur != 0) || !VALID_DATETIME((&(dt->value.date)))) 984070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 985070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 986070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->type = XML_SCHEMAS_DATETIME; 987070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 988070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (val != NULL) 989070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *val = dt; 99080b19092f24410a6b869abf519227686e8f207caDaniel Veillard else 99180b19092f24410a6b869abf519227686e8f207caDaniel Veillard xmlSchemaFreeValue(dt); 992070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 993070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 994070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 995070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillarderror: 996070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dt != NULL) 997070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaFreeValue(dt); 998070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 999070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1000070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1001070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 10025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaValidateDuration: 1003070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @type: the predefined type 1004070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @duration: string to analyze 1005070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @val: the return computed value 1006070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1007070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Check that @duration conforms to the lexical space of the duration type. 1008070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * if true a value is computed and returned in @val. 1009070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1010070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 1011070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * and -1 in case of internal or API error. 1012070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1013070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1014dda8f1ba9fb2e731e2dd6aa325ed07add7905ec3Daniel VeillardxmlSchemaValidateDuration (xmlSchemaTypePtr type ATTRIBUTE_UNUSED, 1015118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard const xmlChar *duration, xmlSchemaValPtr *val) { 1016070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = duration; 1017070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaValPtr dur; 1018070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int isneg = 0; 1019070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard unsigned int seq = 0; 1020070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1021070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (duration == NULL) 1022070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1023070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1024070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == '-') { 1025070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard isneg = 1; 1026070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1027070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1028070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1029070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* duration must start with 'P' (after sign) */ 1030070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur++ != 'P') 1031070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1032070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 103380b19092f24410a6b869abf519227686e8f207caDaniel Veillard if (*cur == 0) 103480b19092f24410a6b869abf519227686e8f207caDaniel Veillard return 1; 103580b19092f24410a6b869abf519227686e8f207caDaniel Veillard 1036070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION); 1037070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dur == NULL) 1038070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1039070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1040070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while (*cur != 0) { 1041070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard double num; 1042070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int num_type = 0; /* -1 = invalid, 0 = int, 1 = floating */ 1043070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar desig[] = {'Y', 'M', 'D', 'H', 'M', 'S'}; 1044070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const double multi[] = { 0.0, 0.0, 86400.0, 3600.0, 60.0, 1.0, 0.0}; 1045070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1046070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* input string should be empty or invalid date/time item */ 1047070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (seq >= sizeof(desig)) 1048070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1049070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1050070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* T designator must be present for time items */ 1051070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == 'T') { 1052070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (seq <= 3) { 1053070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard seq = 3; 1054070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1055070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } else 1056070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1057070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } else if (seq == 3) 1058070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1059070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1060070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* parse the number portion of the item */ 1061070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_NUM(num, cur, num_type); 1062070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1063070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((num_type == -1) || (*cur == 0)) 1064070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1065070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1066070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* update duration based on item type */ 1067070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while (seq < sizeof(desig)) { 1068070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == desig[seq]) { 1069070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1070070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* verify numeric type; only seconds can be float */ 1071070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((num_type != 0) && (seq < (sizeof(desig)-1))) 1072070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1073070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1074070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard switch (seq) { 1075070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case 0: 1076070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.mon = (long)num * 12; 1077070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1078070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case 1: 1079070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.mon += (long)num; 1080070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1081070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard default: 1082070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* convert to seconds using multiplier */ 1083070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.sec += num * multi[seq]; 1084070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard seq++; 1085070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1086070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1087070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1088070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; /* exit loop */ 1089070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1090070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* no date designators found? */ 1091070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (++seq == 3) 1092070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1093070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1094070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1095070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1096070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1097070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (isneg) { 1098070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.mon = -dur->value.dur.mon; 1099070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.day = -dur->value.dur.day; 1100070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.sec = -dur->value.dur.sec; 1101070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1102070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1103070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (val != NULL) 1104070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *val = dur; 110580b19092f24410a6b869abf519227686e8f207caDaniel Veillard else 110680b19092f24410a6b869abf519227686e8f207caDaniel Veillard xmlSchemaFreeValue(dur); 1107070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1108070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1109070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1110070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillarderror: 1111070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dur != NULL) 1112070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaFreeValue(dur); 1113070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1114070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1115070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1116a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard/** 1117a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * xmlSchemaStrip: 1118a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * @value: a value 1119a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * 1120a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Removes the leading and ending spaces of a string 1121a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * 1122a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Returns the new string or NULL if no change was required. 1123a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard */ 1124a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillardstatic xmlChar * 1125a1a9d0410000cc69874e53e438b250037d3e14cdDaniel VeillardxmlSchemaStrip(const xmlChar *value) { 1126a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard const xmlChar *start = value, *end, *f; 1127a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard 1128a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard if (value == NULL) return(NULL); 1129a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard while ((*start != 0) && (IS_BLANK(*start))) start++; 1130a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard end = start; 1131a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard while (*end != 0) end++; 1132a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard f = end; 1133a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard end--; 1134a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard while ((end > start) && (IS_BLANK(*end))) end--; 1135a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard end++; 1136a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard if ((start == value) && (f == end)) return(NULL); 1137a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard return(xmlStrndup(start, end - start)); 1138a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard} 113996a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard 114096a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard/** 1141b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaCollapseString: 1142b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @value: a value 1143b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 1144b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Removes and normalize white spaces in the string 1145b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 1146b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns the new string or NULL if no change was required. 1147b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 1148b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic xmlChar * 1149b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaCollapseString(const xmlChar *value) { 1150b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard const xmlChar *start = value, *end, *f; 1151b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlChar *g; 1152b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard int col = 0; 1153b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 1154b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (value == NULL) return(NULL); 1155b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard while ((*start != 0) && (IS_BLANK(*start))) start++; 1156b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end = start; 1157b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard while (*end != 0) { 1158b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((*end == ' ') && (IS_BLANK(end[1]))) { 1159b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard col = end - start; 1160b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard break; 1161b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } else if ((*end == 0xa) || (*end == 0x9) || (*end == 0xd)) { 1162b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard col = end - start; 1163b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard break; 1164b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1165b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end++; 1166b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1167b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (col == 0) { 1168b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard f = end; 1169b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end--; 1170b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard while ((end > start) && (IS_BLANK(*end))) end--; 1171b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end++; 1172b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((start == value) && (f == end)) return(NULL); 1173b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(xmlStrndup(start, end - start)); 1174b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1175b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard start = xmlStrdup(start); 1176b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (start == NULL) return(NULL); 1177b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard g = (xmlChar *) (start + col); 1178b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end = g; 1179b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard while (*end != 0) { 1180b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (IS_BLANK(*end)) { 1181b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end++; 1182b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard while (IS_BLANK(*end)) end++; 1183b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (*end != 0) 1184b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *g++ = ' '; 1185b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } else 1186b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *g++ = *end++; 1187b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1188b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *g = 0; 1189b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return((xmlChar *) start); 1190b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard} 1191b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 1192b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/** 119328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * xmlSchemaValAtomicListNode: 119428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @type: the predefined atomic type for a token in the list 119528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @value: the list value to check 119628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @ret: the return computed value 119728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @node: the node containing the value 119828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * 119928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * Check that a value conforms to the lexical space of the predefined 120028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * list type. if true a value is computed and returned in @ret. 120128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * 1202a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Returns the number of items if this validates, a negative error code 1203a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * number otherwise 120428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard */ 120528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillardstatic int 120628c52ab518d34a36fd8da6870a5850088f129a6aDaniel VeillardxmlSchemaValAtomicListNode(xmlSchemaTypePtr type, const xmlChar *value, 120728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard xmlSchemaValPtr *ret, xmlNodePtr node) { 120828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard xmlChar *val, *cur, *endval; 120928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard int nb_values = 0; 1210580ced8ee28ecd99374da9383897678e4ba6c358Daniel Veillard int tmp = 0; 121128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard 121228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (value == NULL) { 121328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard return(-1); 121428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 121528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard val = xmlStrdup(value); 121628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (val == NULL) { 121728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard return(-1); 121828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 121928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard cur = val; 122028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard /* 122128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * Split the list 122228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard */ 1223a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard while (IS_BLANK(*cur)) *cur++ = 0; 122428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while (*cur != 0) { 122528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (IS_BLANK(*cur)) { 122628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard *cur = 0; 122728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard cur++; 122828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while (IS_BLANK(*cur)) *cur++ = 0; 122928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } else { 123028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard nb_values++; 123128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard cur++; 123228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while ((*cur != 0) && (!IS_BLANK(*cur))) cur++; 123328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 123428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 123528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (nb_values == 0) { 123628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (ret != NULL) { 123728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard TODO 123828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 123928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard xmlFree(val); 1240a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard return(nb_values); 124128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 124228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard endval = cur; 124328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard cur = val; 124428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while ((*cur == 0) && (cur != endval)) cur++; 124528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while (cur != endval) { 124628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard tmp = xmlSchemaValPredefTypeNode(type, cur, NULL, node); 124728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (tmp != 0) 124828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard break; 124928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while (*cur != 0) cur++; 125028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while ((*cur == 0) && (cur != endval)) cur++; 125128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 125228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard xmlFree(val); 125328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (ret != NULL) { 125428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard TODO 125528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 1256a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard if (tmp == 0) 1257a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard return(nb_values); 1258a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard return(-1); 125928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard} 126028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard 126128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard/** 1262e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * xmlSchemaParseUInt: 1263e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @str: pointer to the string R/W 1264e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @llo: pointer to the low result 1265e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @lmi: pointer to the mid result 1266e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @lhi: pointer to the high result 1267e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * 1268e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * Parse an unsigned long into 3 fields. 1269e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * 1270e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * Returns the number of chars parsed or -1 if overflow of the capacity 1271e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard */ 1272e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardstatic int 1273e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel VeillardxmlSchemaParseUInt(const xmlChar **str, unsigned long *llo, 1274e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard unsigned long *lmi, unsigned long *lhi) { 1275e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard unsigned long lo = 0, mi = 0, hi = 0; 1276e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard const xmlChar *tmp, *cur = *str; 1277e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard int ret = 0, i = 0; 1278e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard 1279e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while (*cur == '0') { 1280e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ret++; 1281e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard cur++; 1282e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1283e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard tmp = cur; 1284e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while ((*tmp != 0) && (*tmp >= '0') && (*tmp <= '9')) { 1285e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard i++;tmp++;ret++; 1286e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1287e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (i > 24) { 1288e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *str = tmp; 1289e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return(-1); 1290e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1291e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while (i > 16) { 1292e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard hi = hi * 10 + (*cur++ - '0'); 1293e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard i--; 1294e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1295e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while (i > 8) { 1296e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard mi = mi * 10 + (*cur++ - '0'); 1297e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard i--; 1298e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1299e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while (i > 0) { 1300e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard lo = lo * 10 + (*cur++ - '0'); 1301e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard i--; 1302e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1303e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard 1304e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *str = cur; 1305e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *llo = lo; 1306e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *lmi = mi; 1307e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *lhi = hi; 1308e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return(ret); 1309e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard} 1310e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard 1311e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard/** 1312b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaValAtomicType: 13134255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @type: the predefined type 13144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value: the value to check 13154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @val: the return computed value 1316c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @node: the node containing the value 1317b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * flags: flags to control the vlidation 13184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 1319b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check that a value conforms to the lexical space of the atomic type. 13204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * if true a value is computed and returned in @val. 13214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 13224255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 13234255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * and -1 in case of internal or API error. 13244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 1325b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic int 1326b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar *value, 1327b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlSchemaValPtr *val, xmlNodePtr node, int flags) { 13284255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaValPtr v; 1329b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlChar *norm = NULL; 133096a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard int ret; 13314255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 13324255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (xmlSchemaTypesInitialized == 0) 13334255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(-1); 13344255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (type == NULL) 13354255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(-1); 13365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 13374255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (val != NULL) 13384255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *val = NULL; 1339b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((flags == 0) && (value != NULL)) { 1340b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((type->flags != XML_SCHEMAS_STRING) && 1341b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard (type->flags != XML_SCHEMAS_NORMSTRING)) { 1342b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard norm = xmlSchemaCollapseString(value); 1343b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (norm != NULL) 1344b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard value = norm; 1345c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 1346b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1347b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 1348b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard switch (type->flags) { 1349b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_UNKNOWN: 1350b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (type == xmlSchemaTypeAnyTypeDef) 1351b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return0; 1352b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto error; 1353b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_STRING: 1354b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return0; 1355b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_NORMSTRING: 1356b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard TODO 1357b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return0; 1358b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_DECIMAL: { 1359b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard const xmlChar *cur = value, *tmp; 1360b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard int frac = 0, len, neg = 0; 1361b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard unsigned long base = 0; 1362b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (cur == NULL) 1363b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return1; 1364b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (*cur == '+') 1365b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard cur++; 1366b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else if (*cur == '-') { 1367b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard neg = 1; 1368b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard cur++; 1369b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 13704255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard tmp = cur; 13714255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { 13724255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard base = base * 10 + (*cur - '0'); 13734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard cur++; 13744255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 1375b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard len = cur - tmp; 1376b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (*cur == '.') { 1377b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard cur++; 1378b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard tmp = cur; 1379b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard while ((*cur >= '0') && (*cur <= '9')) { 1380b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard base = base * 10 + (*cur - '0'); 1381b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard cur++; 1382b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1383b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard frac = cur - tmp; 13844255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 1385b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (*cur != 0) 1386b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return1; 1387b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (val != NULL) { 1388b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL); 1389b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (v != NULL) { 1390e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard v->value.decimal.lo = base; 1391b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard v->value.decimal.sign = neg; 1392b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard v->value.decimal.frac = frac; 1393b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard v->value.decimal.total = frac + len; 1394b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *val = v; 1395b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 13964255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 1397b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return0; 13984255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 1399b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_TIME: 1400b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GDAY: 1401b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GMONTH: 1402b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GMONTHDAY: 1403b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GYEAR: 1404b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GYEARMONTH: 1405b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_DATE: 1406b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_DATETIME: 1407b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard ret = xmlSchemaValidateDates(type, value, val); 1408b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard break; 1409b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_DURATION: 1410b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard ret = xmlSchemaValidateDuration(type, value, val); 1411b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard break; 1412b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_FLOAT: 1413b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_DOUBLE: { 1414b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard const xmlChar *cur = value; 1415b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard int neg = 0; 1416b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (cur == NULL) 1417b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return1; 1418b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((cur[0] == 'N') && (cur[1] == 'a') && (cur[2] == 'N')) { 1419b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard cur += 3; 1420b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (*cur != 0) 1421b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return1; 1422b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (val != NULL) { 1423b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (type == xmlSchemaTypeFloatDef) { 1424b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT); 1425b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (v != NULL) { 1426b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard v->value.f = (float) xmlXPathNAN; 1427b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } else { 1428b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlSchemaFreeValue(v); 1429b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto error; 1430b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1431b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } else { 1432b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE); 1433b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (v != NULL) { 1434b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard v->value.d = xmlXPathNAN; 1435b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } else { 1436b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlSchemaFreeValue(v); 1437b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto error; 1438b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1439b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1440b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *val = v; 1441b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1442b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return0; 14434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 1444b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (*cur == '-') { 1445b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard neg = 1; 1446b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard cur++; 144791a1325beb87de8fde190157a545504632c169feDaniel Veillard } 1448b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((cur[0] == 'I') && (cur[1] == 'N') && (cur[2] == 'F')) { 1449b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard cur += 3; 1450b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (*cur != 0) 1451b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return1; 1452b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (val != NULL) { 1453b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (type == xmlSchemaTypeFloatDef) { 1454b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT); 1455b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (v != NULL) { 1456b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (neg) 1457b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard v->value.f = (float) xmlXPathNINF; 1458b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else 1459b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard v->value.f = (float) xmlXPathPINF; 1460b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } else { 1461b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlSchemaFreeValue(v); 1462b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto error; 1463b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1464b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } else { 1465b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE); 1466b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (v != NULL) { 1467b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (neg) 1468b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard v->value.d = xmlXPathNINF; 1469b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else 1470b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard v->value.d = xmlXPathPINF; 1471b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } else { 1472b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlSchemaFreeValue(v); 1473b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto error; 1474b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1475b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1476b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *val = v; 1477b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1478b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return0; 147996a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard } 1480b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((neg == 0) && (*cur == '+')) 1481b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard cur++; 1482b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((cur[0] == 0) || (cur[0] == '+') || (cur[0] == '-')) 1483b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return1; 1484b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard while ((*cur >= '0') && (*cur <= '9')) { 1485b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard cur++; 1486b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1487b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (*cur == '.') { 1488b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard cur++; 1489b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard while ((*cur >= '0') && (*cur <= '9')) 1490b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard cur++; 1491b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1492b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((*cur == 'e') || (*cur == 'E')) { 1493b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard cur++; 1494b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((*cur == '-') || (*cur == '+')) 1495b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard cur++; 1496b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard while ((*cur >= '0') && (*cur <= '9')) 1497b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard cur++; 1498ef2e4ec1a2acce1cba59885b83cc167fd66bd890Daniel Veillard } 149996a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard if (*cur != 0) 1500b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return1; 150196a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard if (val != NULL) { 150296a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard if (type == xmlSchemaTypeFloatDef) { 150396a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT); 150496a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard if (v != NULL) { 1505b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (sscanf((const char *)value, "%f", &(v->value.f))==1) { 1506b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *val = v; 1507b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } else { 1508b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlGenericError(xmlGenericErrorContext, 1509b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard "failed to scanf float %s\n", value); 1510b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlSchemaFreeValue(v); 1511b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return1; 1512b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 151396a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard } else { 1514b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto error; 151596a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard } 151696a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard } else { 151796a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE); 151896a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard if (v != NULL) { 1519b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (sscanf((const char *)value, "%lf", &(v->value.d))==1) { 1520b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *val = v; 1521b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } else { 1522b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlGenericError(xmlGenericErrorContext, 1523b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard "failed to scanf double %s\n", value); 1524b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlSchemaFreeValue(v); 1525b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return1; 1526b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 152796a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard } else { 1528b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto error; 152996a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard } 153096a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard } 153196a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard } 1532b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return0; 153396a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard } 1534b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_BOOLEAN: { 1535b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard const xmlChar *cur = value; 1536b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 1537b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((cur[0] == '0') && (cur[1] == 0)) 1538b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard ret = 0; 1539b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else if ((cur[0] == '1') && (cur[1] == 0)) 1540b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard ret = 1; 1541b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else if ((cur[0] == 't') && (cur[1] == 'r') && (cur[2] == 'u') && 1542b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard (cur[3] == 'e') && (cur[4] == 0)) 1543b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard ret = 1; 1544b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else if ((cur[0] == 'f') && (cur[1] == 'a') && (cur[2] == 'l') && 1545b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard (cur[3] == 's') && (cur[4] == 'e') && (cur[5] == 0)) 1546b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard ret = 0; 1547b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else 1548b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return1; 1549b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (val != NULL) { 1550b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_BOOLEAN); 1551b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (v != NULL) { 1552b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard v->value.b = ret; 1553b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *val = v; 1554b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } else { 1555b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto error; 1556b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1557b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1558b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return0; 155984d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillard } 1560b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_TOKEN: { 1561b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard const xmlChar *cur = value; 1562b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 1563b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (IS_BLANK(*cur)) 1564b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return1; 1565b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 1566b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard while (*cur != 0) { 1567b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { 1568b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return1; 1569b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } else if (*cur == ' ') { 1570b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard cur++; 1571b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (*cur == 0) 1572b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return1; 1573b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (*cur == ' ') 1574b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return1; 1575b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } else { 1576b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard cur++; 1577b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1578b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 157996a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard if (val != NULL) { 1580b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_TOKEN); 1581b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (v != NULL) { 1582b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard v->value.str = xmlStrdup(value); 1583b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *val = v; 158496a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard } else { 1585b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto error; 1586b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1587b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1588b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return0; 1589b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1590b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_LANGUAGE: 1591b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (xmlCheckLanguageID(value) == 1) { 1592b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (val != NULL) { 1593b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_LANGUAGE); 159496a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard if (v != NULL) { 1595b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard v->value.str = xmlStrdup(value); 1596b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *val = v; 159796a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard } else { 1598b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto error; 159996a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard } 160096a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard } 1601b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return0; 160296a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard } 1603b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return1; 1604b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_NMTOKEN: 1605b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (xmlValidateNMToken(value, 1) == 0) { 1606b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (val != NULL) { 1607b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NMTOKEN); 1608b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (v != NULL) { 1609b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard v->value.str = xmlStrdup(value); 161096a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard *val = v; 161196a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard } else { 1612b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto error; 161396a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard } 161496a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard } 1615b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return0; 1616b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1617b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return1; 1618b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_NMTOKENS: 1619b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard ret = xmlSchemaValAtomicListNode(xmlSchemaTypeNmtokenDef, 1620b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard value, val, node); 1621b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (ret > 0) 1622b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard ret = 0; 1623b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else 1624b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard ret = 1; 1625b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto done; 1626b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_NAME: 1627b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard ret = xmlValidateName(value, 1); 1628b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((ret == 0) && (val != NULL)) { 1629b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard TODO; 1630b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1631b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto done; 1632e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_QNAME: { 1633e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard xmlChar *uri = NULL; 1634e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard xmlChar *local = NULL; 1635e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard 1636b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard ret = xmlValidateQName(value, 1); 1637e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((ret == 0) && (node != NULL)) { 1638e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard xmlChar *prefix; 1639e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard local = xmlSplitQName2(value, &prefix); 1640e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (prefix != NULL) { 1641e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard xmlNsPtr ns; 1642e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard 1643e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ns = xmlSearchNs(node->doc, node, prefix); 1644e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (ns == NULL) 1645e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ret = 1; 1646e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard else if (val != NULL) 1647e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard uri = xmlStrdup(ns->href); 1648e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1649e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((local != NULL) && ((val == NULL) || (ret != 0))) 1650e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard xmlFree(local); 1651e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (prefix != NULL) 1652e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard xmlFree(prefix); 1653e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1654b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((ret == 0) && (val != NULL)) { 1655e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_QNAME); 1656e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (v != NULL) { 1657e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (local != NULL) 1658e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard v->value.qname.name = local; 1659e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard else 1660e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard v->value.qname.name = xmlStrdup(value); 1661e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (uri != NULL) 1662e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard v->value.qname.uri = uri; 1663e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard 1664e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *val = v; 1665e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } else { 1666e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (local != NULL) 1667e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard xmlFree(local); 1668e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (uri != NULL) 1669e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard xmlFree(uri); 1670e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard goto error; 1671e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1672b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1673b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto done; 1674e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1675b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_NCNAME: 1676b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard ret = xmlValidateNCName(value, 1); 1677b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((ret == 0) && (val != NULL)) { 1678b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NCNAME); 167996a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard if (v != NULL) { 1680b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard v->value.str = xmlStrdup(value); 1681b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *val = v; 1682b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } else { 1683b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto error; 1684b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1685b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1686b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto done; 1687b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_ID: 1688b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard ret = xmlValidateNCName(value, 1); 1689b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((ret == 0) && (val != NULL)) { 1690b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard TODO; 1691b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1692b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((ret == 0) && (node != NULL) && 1693b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 1694b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 1695b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard /* 1696b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * NOTE: the IDness might have already be declared in the DTD 1697b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 1698b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (attr->atype != XML_ATTRIBUTE_ID) { 1699b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlIDPtr res; 1700b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlChar *strip; 1701b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 1702b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard strip = xmlSchemaStrip(value); 1703b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (strip != NULL) { 1704b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard res = xmlAddID(NULL, node->doc, strip, attr); 1705b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlFree(strip); 1706b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } else 1707b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard res = xmlAddID(NULL, node->doc, value, attr); 1708b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (res == NULL) { 1709b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard ret = 2; 171096a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard } else { 1711b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard attr->atype = XML_ATTRIBUTE_ID; 171296a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard } 171396a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard } 171484d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillard } 1715b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto done; 1716b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_IDREF: 1717b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard ret = xmlValidateNCName(value, 1); 1718b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((ret == 0) && (val != NULL)) { 1719b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard TODO; 1720c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 1721b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((ret == 0) && (node != NULL) && 1722b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 1723b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 1724b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlChar *strip; 172596a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard 1726b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard strip = xmlSchemaStrip(value); 1727b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (strip != NULL) { 1728b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlAddRef(NULL, node->doc, strip, attr); 1729b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlFree(strip); 1730b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } else 1731b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlAddRef(NULL, node->doc, value, attr); 1732b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard attr->atype = XML_ATTRIBUTE_IDREF; 1733c5a70f264550ee39da267e81dccd95508ed367ddDaniel Veillard } 1734b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto done; 1735b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_IDREFS: 1736b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard ret = xmlSchemaValAtomicListNode(xmlSchemaTypeIdrefDef, 1737b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard value, val, node); 1738b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (ret < 0) 1739b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard ret = 2; 1740b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else 1741b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard ret = 0; 1742b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((ret == 0) && (node != NULL) && 1743b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 1744b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 1745b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 1746b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard attr->atype = XML_ATTRIBUTE_IDREFS; 1747b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1748b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto done; 1749b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_ENTITY: { 1750ef2e4ec1a2acce1cba59885b83cc167fd66bd890Daniel Veillard xmlChar *strip; 1751b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard ret = xmlValidateNCName(value, 1); 1752b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((node == NULL) || (node->doc == NULL)) 1753b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard ret = 3; 1754b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (ret == 0) { 1755b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlEntityPtr ent; 1756249d7bbee28570177a8573a99eab4aa9e27384d9Daniel Veillard 1757249d7bbee28570177a8573a99eab4aa9e27384d9Daniel Veillard strip = xmlSchemaStrip(value); 1758249d7bbee28570177a8573a99eab4aa9e27384d9Daniel Veillard if (strip != NULL) { 1759b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard ent = xmlGetDocEntity(node->doc, strip); 1760249d7bbee28570177a8573a99eab4aa9e27384d9Daniel Veillard xmlFree(strip); 1761249d7bbee28570177a8573a99eab4aa9e27384d9Daniel Veillard } else { 1762b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard ent = xmlGetDocEntity(node->doc, value); 1763249d7bbee28570177a8573a99eab4aa9e27384d9Daniel Veillard } 1764b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((ent == NULL) || 1765b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard (ent->etype != XML_EXTERNAL_GENERAL_UNPARSED_ENTITY)) 1766b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard ret = 4; 1767c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard } 1768b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((ret == 0) && (val != NULL)) { 1769b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard TODO; 1770b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1771b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((ret == 0) && (node != NULL) && 1772b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 1773b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 1774a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard 1775b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard attr->atype = XML_ATTRIBUTE_ENTITY; 1776b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1777b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto done; 1778a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard } 1779b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_ENTITIES: 1780b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((node == NULL) || (node->doc == NULL)) 1781b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return3; 1782b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard ret = xmlSchemaValAtomicListNode(xmlSchemaTypeEntityDef, 1783b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard value, val, node); 1784b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (ret <= 0) 1785b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard ret = 1; 1786b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else 1787b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard ret = 0; 1788b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((ret == 0) && (node != NULL) && 1789b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 1790b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 1791b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 1792b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard attr->atype = XML_ATTRIBUTE_ENTITIES; 1793b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1794b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto done; 1795e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_NOTATION: { 1796e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard xmlChar *uri = NULL; 1797e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard xmlChar *local = NULL; 1798e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard 1799e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ret = xmlValidateQName(value, 1); 1800e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((ret == 0) && (node != NULL)) { 1801e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard xmlChar *prefix; 1802e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard local = xmlSplitQName2(value, &prefix); 1803e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (prefix != NULL) { 1804e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard xmlNsPtr ns; 1805e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard 1806e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ns = xmlSearchNs(node->doc, node, prefix); 1807e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (ns == NULL) 1808e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ret = 1; 1809e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard else if (val != NULL) 1810e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard uri = xmlStrdup(ns->href); 1811e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1812e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((local != NULL) && ((val == NULL) || (ret != 0))) 1813e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard xmlFree(local); 1814e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (prefix != NULL) 1815e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard xmlFree(prefix); 1816e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1817e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((node == NULL) || (node->doc == NULL)) 1818e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ret = 3; 1819e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (ret == 0) { 1820e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ret = xmlValidateNotationUse(NULL, node->doc, value); 1821e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (ret == 1) 1822e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ret = 0; 1823e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard else 1824e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ret = 1; 1825e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1826e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((ret == 0) && (val != NULL)) { 1827e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NOTATION); 1828e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (v != NULL) { 1829e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (local != NULL) 1830e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard v->value.qname.name = local; 1831e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard else 1832e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard v->value.qname.name = xmlStrdup(value); 1833e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (uri != NULL) 1834e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard v->value.qname.uri = uri; 1835e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard 1836e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *val = v; 1837e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } else { 1838e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (local != NULL) 1839e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard xmlFree(local); 1840e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (uri != NULL) 1841e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard xmlFree(uri); 1842e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard goto error; 1843e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1844e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1845e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard goto done; 1846e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1847b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_ANYURI: { 1848b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlURIPtr uri; 1849a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard 1850b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard uri = xmlParseURI((const char *) value); 1851b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (uri == NULL) 1852b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return1; 1853b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (val != NULL) { 1854b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard TODO; 1855a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard } 1856b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlFreeURI(uri); 1857b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return0; 1858a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard } 1859e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_INTEGER: 1860e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_PINTEGER: 1861e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_NPINTEGER: 1862e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_NINTEGER: 1863e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_NNINTEGER: { 1864b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard const xmlChar *cur = value; 1865e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard unsigned long lo, mi, hi; 1866b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard int sign = 0; 1867b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (cur == NULL) 1868b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return1; 1869b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (*cur == '-') { 1870b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard sign = 1; 1871b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard cur++; 1872b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } else if (*cur == '+') 1873b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard cur++; 1874e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); 1875e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (ret == 0) 1876e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard goto return1; 1877b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (*cur != 0) 1878b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return1; 1879e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (type->flags == XML_SCHEMAS_NPINTEGER) { 1880e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((sign == 0) && 1881e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((hi != 0) || (mi != 0) || (lo != 0))) 1882e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard goto return1; 1883e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } else if (type->flags == XML_SCHEMAS_PINTEGER) { 1884e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (sign == 1) 1885e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard goto return1; 1886e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((hi == 0) && (mi == 0) && (lo == 0)) 1887e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard goto return1; 1888e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } else if (type->flags == XML_SCHEMAS_NINTEGER) { 1889e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (sign == 0) 1890e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard goto return1; 1891e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((hi == 0) && (mi == 0) && (lo == 0)) 1892e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard goto return1; 1893e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } else if (type->flags == XML_SCHEMAS_NNINTEGER) { 1894e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((sign == 1) && 1895e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((hi != 0) || (mi != 0) || (lo != 0))) 1896e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard goto return1; 1897e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1898e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard /* 1899e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * We can store a value only if no overflow occured 1900e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard */ 1901e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((ret > 0) && (val != NULL)) { 1902e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard v = xmlSchemaNewValue(type->flags); 1903b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (v != NULL) { 1904e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard v->value.decimal.lo = lo; 1905e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard v->value.decimal.mi = lo; 1906e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard v->value.decimal.hi = lo; 1907b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard v->value.decimal.sign = sign; 1908b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard v->value.decimal.frac = 0; 1909e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard v->value.decimal.total = cur - value; 1910b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *val = v; 1911b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1912b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1913b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return0; 1914a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard } 1915e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_LONG: 1916e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_BYTE: 1917e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_SHORT: 1918e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_INT: { 1919b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard const xmlChar *cur = value; 1920e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard unsigned long lo, mi, hi; 1921b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard int total = 0; 1922b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard int sign = 0; 1923b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (cur == NULL) 1924b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return1; 1925b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (*cur == '-') { 1926b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard sign = 1; 1927b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard cur++; 1928e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } else if (*cur == '+') 1929b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard cur++; 1930e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); 1931e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (ret <= 0) 1932e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard goto return1; 1933b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (*cur != 0) 1934b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return1; 1935e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (type->flags == XML_SCHEMAS_LONG) { 1936e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (hi >= 922) { 1937e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (hi > 922) 1938e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard goto return1; 1939e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (mi >= 33720368) { 1940e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (mi > 33720368) 1941e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard goto return1; 1942e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((sign == 0) && (lo > 54775807)) 1943e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard goto return1; 1944e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((sign == 1) && (lo > 54775808)) 1945e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard goto return1; 1946e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1947b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1948e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } else if (type->flags == XML_SCHEMAS_INT) { 1949e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (hi != 0) 1950e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard goto return1; 1951e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (mi >= 21) { 1952e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (mi > 21) 1953e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard goto return1; 1954e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((sign == 0) && (lo > 47483647)) 1955e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard goto return1; 1956e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((sign == 1) && (lo > 47483648)) 1957e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard goto return1; 1958e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1959e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } else if (type->flags == XML_SCHEMAS_SHORT) { 1960e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((mi != 0) || (hi != 0)) 1961e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard goto return1; 1962e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((sign == 1) && (lo > 32768)) 1963e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard goto return1; 1964e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((sign == 0) && (lo > 32767)) 1965e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard goto return1; 1966e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } else if (type->flags == XML_SCHEMAS_BYTE) { 1967e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((mi != 0) || (hi != 0)) 1968e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard goto return1; 1969e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((sign == 1) && (lo > 128)) 1970e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard goto return1; 1971e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((sign == 0) && (lo > 127)) 1972e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard goto return1; 1973b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1974c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (val != NULL) { 1975e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard v = xmlSchemaNewValue(type->flags); 1976c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (v != NULL) { 1977e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard v->value.decimal.lo = lo; 1978e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard v->value.decimal.mi = lo; 1979e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard v->value.decimal.hi = lo; 1980e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard v->value.decimal.sign = sign; 1981b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard v->value.decimal.frac = 0; 1982b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard v->value.decimal.total = total; 1983c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard *val = v; 1984c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 1985c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 1986b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return0; 1987c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 1988e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_UINT: 1989e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_ULONG: 1990e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_USHORT: 1991e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_UBYTE: { 1992b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard const xmlChar *cur = value; 1993e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard unsigned long lo, mi, hi; 1994b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard int total = 0; 1995b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (cur == NULL) 1996b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return1; 1997e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); 1998e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (ret <= 0) 1999e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard goto return1; 2000b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (*cur != 0) 2001b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return1; 2002e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (type->flags == XML_SCHEMAS_ULONG) { 2003e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (hi >= 1844) { 2004e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (hi > 1844) 2005e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard goto return1; 2006e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (mi >= 67440737) { 2007e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (mi > 67440737) 2008e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard goto return1; 2009e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (lo > 9551615) 2010e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard goto return1; 2011e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 2012b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 2013e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } else if (type->flags == XML_SCHEMAS_UINT) { 2014e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (hi != 0) 2015e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard goto return1; 2016e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (mi >= 42) { 2017e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (mi > 42) 2018e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard goto return1; 2019e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (lo > 94967295) 2020e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard goto return1; 2021e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 2022e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } else if (type->flags == XML_SCHEMAS_USHORT) { 2023e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((mi != 0) || (hi != 0)) 2024e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard goto return1; 2025e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (lo > 65535) 2026e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard goto return1; 2027e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } else if (type->flags == XML_SCHEMAS_UBYTE) { 2028e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((mi != 0) || (hi != 0)) 2029e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard goto return1; 2030e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (lo > 255) 2031e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard goto return1; 2032b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 2033b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (val != NULL) { 2034e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard v = xmlSchemaNewValue(type->flags); 2035b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (v != NULL) { 2036e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard v->value.decimal.lo = lo; 2037e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard v->value.decimal.mi = mi; 2038e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard v->value.decimal.hi = hi; 2039e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard v->value.decimal.sign = 0; 2040b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard v->value.decimal.frac = 0; 2041b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard v->value.decimal.total = total; 2042b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *val = v; 2043b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 2044b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 2045b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard goto return0; 2046c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 20474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 2048b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 2049b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillarddone: 2050b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (norm != NULL) xmlFree(norm); 2051b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(ret); 2052b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardreturn3: 2053b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (norm != NULL) xmlFree(norm); 2054b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(3); 2055b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardreturn1: 2056b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (norm != NULL) xmlFree(norm); 2057b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 2058b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardreturn0: 2059b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (norm != NULL) xmlFree(norm); 206009628210bdf22ac80a0c6f3e4228c1617c0887ecDaniel Veillard return(0); 2061b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillarderror: 2062b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (norm != NULL) xmlFree(norm); 2063b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 2064b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard} 2065b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 2066b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/** 2067b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaValPredefTypeNode: 2068b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @type: the predefined type 2069b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @value: the value to check 2070b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @val: the return computed value 2071b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @node: the node containing the value 2072b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 2073b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check that a value conforms to the lexical space of the predefined type. 2074b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * if true a value is computed and returned in @val. 2075b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 2076b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns 0 if this validates, a positive error code number otherwise 2077b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * and -1 in case of internal or API error. 2078b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 2079b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardint 2080b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaValPredefTypeNode(xmlSchemaTypePtr type, const xmlChar *value, 2081b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlSchemaValPtr *val, xmlNodePtr node) { 2082b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(xmlSchemaValAtomicType(type, value, val, node, 0)); 20834255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 20844255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 20854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 2086c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * xmlSchemaValidatePredefinedType: 2087c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @type: the predefined type 2088c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @value: the value to check 2089c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @val: the return computed value 2090c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * 2091c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * Check that a value conforms to the lexical space of the predefined type. 2092c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * if true a value is computed and returned in @val. 2093c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * 2094c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 2095c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * and -1 in case of internal or API error. 2096c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard */ 2097c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillardint 2098c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel VeillardxmlSchemaValidatePredefinedType(xmlSchemaTypePtr type, const xmlChar *value, 2099c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard xmlSchemaValPtr *val) { 2100c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard return(xmlSchemaValPredefTypeNode(type, value, val, NULL)); 2101c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard} 2102c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard 2103c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard/** 21044255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCompareDecimals: 21054255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @x: a first decimal value 21064255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @y: a second decimal value 21074255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 21084255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Compare 2 decimals 21094255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 21104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y and -2 in case of error 21114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 21124255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic int 21134255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaCompareDecimals(xmlSchemaValPtr x, xmlSchemaValPtr y) 21144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard{ 21154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaValPtr swp; 2116e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard int order = 1, p; 21174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard unsigned long tmp; 21184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 2119e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((x->value.decimal.sign) && 2120e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((x->value.decimal.lo != 0) || 2121e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (x->value.decimal.mi != 0) || 2122e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (x->value.decimal.hi != 0))) { 2123e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((y->value.decimal.sign) && 2124e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((y->value.decimal.lo != 0) || 2125e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (y->value.decimal.mi != 0) || 2126e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (y->value.decimal.hi != 0))) 212780b19092f24410a6b869abf519227686e8f207caDaniel Veillard order = -1; 212880b19092f24410a6b869abf519227686e8f207caDaniel Veillard else 212980b19092f24410a6b869abf519227686e8f207caDaniel Veillard return (-1); 2130e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } else if ((y->value.decimal.sign) && 2131e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((y->value.decimal.lo != 0) || 2132e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (y->value.decimal.mi != 0) || 2133e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (y->value.decimal.hi != 0))) { 21344255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return (1); 213580b19092f24410a6b869abf519227686e8f207caDaniel Veillard } 21364255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (x->value.decimal.frac == y->value.decimal.frac) { 2137e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (x->value.decimal.hi < y->value.decimal.hi) 2138e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return (-order); 2139e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (x->value.decimal.hi < y->value.decimal.hi) 2140e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return (order); 2141e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (x->value.decimal.mi < y->value.decimal.mi) 2142e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return (-order); 2143e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (x->value.decimal.mi < y->value.decimal.mi) 2144e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return (order); 2145e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (x->value.decimal.lo < y->value.decimal.lo) 214680b19092f24410a6b869abf519227686e8f207caDaniel Veillard return (-order); 2147e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (x->value.decimal.lo > y->value.decimal.lo) 214880b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(order); 214980b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(0); 21504255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 21514255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (y->value.decimal.frac > x->value.decimal.frac) { 21524255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard swp = y; 21534255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard y = x; 21544255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard x = swp; 21554255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard order = -order; 21564255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 2157e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard p = powten[x->value.decimal.frac - y->value.decimal.frac]; 2158e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard tmp = x->value.decimal.lo / p; 2159e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (tmp > y->value.decimal.lo) 21604255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return (order); 2161e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (tmp < y->value.decimal.lo) 21624255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return (-order); 2163e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard tmp = y->value.decimal.lo * p; 2164e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (x->value.decimal.lo < tmp) 21654255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return (-order); 2166e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (x->value.decimal.lo == tmp) 21674255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return (0); 21684255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return (order); 21694255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 21704255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 21714255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 2172070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xmlSchemaCompareDurations: 2173070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @x: a first duration value 2174070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @y: a second duration value 2175070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 2176070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Compare 2 durations 2177070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 2178070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 2179070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * case of error 2180070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 2181070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 2182070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel VeillardxmlSchemaCompareDurations(xmlSchemaValPtr x, xmlSchemaValPtr y) 2183070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard{ 2184070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard long carry, mon, day; 2185070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard double sec; 218680b19092f24410a6b869abf519227686e8f207caDaniel Veillard int invert = 1; 218780b19092f24410a6b869abf519227686e8f207caDaniel Veillard long xmon, xday, myear, minday, maxday; 2188070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard static const long dayRange [2][12] = { 2189070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard { 0, 28, 59, 89, 120, 150, 181, 212, 242, 273, 303, 334, }, 2190070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard { 0, 31, 62, 92, 123, 153, 184, 215, 245, 276, 306, 337} }; 2191070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 2192070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((x == NULL) || (y == NULL)) 21935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -2; 2194070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 2195070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* months */ 2196070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard mon = x->value.dur.mon - y->value.dur.mon; 2197070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 2198070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* seconds */ 2199070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard sec = x->value.dur.sec - y->value.dur.sec; 2200070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard carry = (long)sec / SECS_PER_DAY; 2201070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard sec -= (double)(carry * SECS_PER_DAY); 2202070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 2203070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* days */ 2204070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard day = x->value.dur.day - y->value.dur.day + carry; 2205070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 2206070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* easy test */ 2207070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (mon == 0) { 2208070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (day == 0) 2209070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (sec == 0.0) 2210070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 2211070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else if (sec < 0.0) 2212070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 2213070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else 2214070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 2215070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else if (day < 0) 2216070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 2217070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else 2218070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 2219070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 2220070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 2221070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (mon > 0) { 2222070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((day >= 0) && (sec >= 0.0)) 2223070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 2224070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else { 2225070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmon = mon; 2226070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xday = -day; 2227070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 2228070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } else if ((day <= 0) && (sec <= 0.0)) { 2229070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 2230070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } else { 223180b19092f24410a6b869abf519227686e8f207caDaniel Veillard invert = -1; 2232070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmon = -mon; 2233070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xday = day; 2234070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 2235070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 2236070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard myear = xmon / 12; 223780b19092f24410a6b869abf519227686e8f207caDaniel Veillard if (myear == 0) { 223880b19092f24410a6b869abf519227686e8f207caDaniel Veillard minday = 0; 223980b19092f24410a6b869abf519227686e8f207caDaniel Veillard maxday = 0; 224080b19092f24410a6b869abf519227686e8f207caDaniel Veillard } else { 224180b19092f24410a6b869abf519227686e8f207caDaniel Veillard maxday = 366 * ((myear + 3) / 4) + 224280b19092f24410a6b869abf519227686e8f207caDaniel Veillard 365 * ((myear - 1) % 4); 224380b19092f24410a6b869abf519227686e8f207caDaniel Veillard minday = maxday - 1; 224480b19092f24410a6b869abf519227686e8f207caDaniel Veillard } 224580b19092f24410a6b869abf519227686e8f207caDaniel Veillard 2246070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmon = xmon % 12; 2247070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard minday += dayRange[0][xmon]; 2248070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard maxday += dayRange[1][xmon]; 2249070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 225080b19092f24410a6b869abf519227686e8f207caDaniel Veillard if ((maxday == minday) && (maxday == xday)) 225180b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(0); /* can this really happen ? */ 2252070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (maxday < xday) 225380b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(-invert); 225480b19092f24410a6b869abf519227686e8f207caDaniel Veillard if (minday > xday) 225580b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(invert); 2256070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 2257070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* indeterminate */ 22585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; 22595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard} 22605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 22615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/* 22625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * macros for adding date/times and durations 22635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 22645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define FQUOTIENT(a,b) (floor(((double)a/(double)b))) 22655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MODULO(a,b) (a - FQUOTIENT(a,b) * b) 22665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define FQUOTIENT_RANGE(a,low,high) (FQUOTIENT((a-low),(high-low))) 22675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MODULO_RANGE(a,low,high) ((MODULO((a-low),(high-low)))+low) 22685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 22695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 22705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * _xmlSchemaDateAdd: 22715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr 22725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dur: an #xmlSchemaValPtr of type #XS_DURATION 22735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 22745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Compute a new date/time from @dt and @dur. This function assumes @dt 22755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * is either #XML_SCHEMAS_DATETIME, #XML_SCHEMAS_DATE, #XML_SCHEMAS_GYEARMONTH, 22765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * or #XML_SCHEMAS_GYEAR. 22775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 22785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns date/time pointer or NULL. 22795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 22805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr 22815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard_xmlSchemaDateAdd (xmlSchemaValPtr dt, xmlSchemaValPtr dur) 22825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{ 22835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValPtr ret; 22845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard long carry, tempdays, temp; 22855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValDatePtr r, d; 22865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValDurationPtr u; 22875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 22885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((dt == NULL) || (dur == NULL)) 22895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 22905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 22915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret = xmlSchemaNewValue(dt->type); 22925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (ret == NULL) 22935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 22945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 22955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r = &(ret->value.date); 22965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard d = &(dt->value.date); 22975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard u = &(dur->value.dur); 22985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 22995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalization */ 23005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (d->mon == 0) 23015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard d->mon = 1; 23025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 23035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize for time zone offset */ 23045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard u->sec -= (d->tzo * 60); 23055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard d->tzo = 0; 23065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 23075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalization */ 23085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (d->day == 0) 23095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard d->day = 1; 23105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 23115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* month */ 23125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry = d->mon + u->mon; 23135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->mon = MODULO_RANGE(carry, 1, 13); 23145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry = FQUOTIENT_RANGE(carry, 1, 13); 23155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 23165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* year (may be modified later) */ 23175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year = d->year + carry; 23185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (r->year == 0) { 23195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (d->year > 0) 23205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year--; 23215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 23225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year++; 23235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 23245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 23255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* time zone */ 23265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->tzo = d->tzo; 23275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->tz_flag = d->tz_flag; 23285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 23295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* seconds */ 23305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->sec = d->sec + u->sec; 23315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry = FQUOTIENT((long)r->sec, 60); 23325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (r->sec != 0.0) { 23335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->sec = MODULO(r->sec, 60.0); 23345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 23355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 23365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* minute */ 23375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry += d->min; 23385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->min = MODULO(carry, 60); 23395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry = FQUOTIENT(carry, 60); 23405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 23415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* hours */ 23425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry += d->hour; 23435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->hour = MODULO(carry, 24); 23445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry = FQUOTIENT(carry, 24); 23455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 23465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* 23475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * days 23485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Note we use tempdays because the temporary values may need more 23495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * than 5 bits 23505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 23515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((VALID_YEAR(r->year)) && (VALID_MONTH(r->mon)) && 23525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (d->day > MAX_DAYINMONTH(r->year, r->mon))) 23535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays = MAX_DAYINMONTH(r->year, r->mon); 23545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (d->day < 1) 23555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays = 1; 23565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 23575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays = d->day; 23585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 23595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays += u->day + carry; 23605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 23615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard while (1) { 23625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (tempdays < 1) { 23635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard long tmon = MODULO_RANGE(r->mon-1, 1, 13); 23645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard long tyr = r->year + FQUOTIENT_RANGE(r->mon-1, 1, 13); 23655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (tyr == 0) 23665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tyr--; 23675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays += MAX_DAYINMONTH(tyr, tmon); 23685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry = -1; 23695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } else if (tempdays > MAX_DAYINMONTH(r->year, r->mon)) { 23705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays = tempdays - MAX_DAYINMONTH(r->year, r->mon); 23715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry = 1; 23725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } else 23735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 23745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 23755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard temp = r->mon + carry; 23765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->mon = MODULO_RANGE(temp, 1, 13); 23775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year = r->year + FQUOTIENT_RANGE(temp, 1, 13); 23785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (r->year == 0) { 23795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (temp < 1) 23805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year--; 23815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 23825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year++; 23835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 23845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 23855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 23865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->day = tempdays; 23875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 23885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* 23895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * adjust the date/time type to the date values 23905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 23915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (ret->type != XML_SCHEMAS_DATETIME) { 23925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((r->hour) || (r->min) || (r->sec)) 23935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret->type = XML_SCHEMAS_DATETIME; 23945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (ret->type != XML_SCHEMAS_DATE) { 23955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((r->mon != 1) && (r->day != 1)) 23965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret->type = XML_SCHEMAS_DATE; 23975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if ((ret->type != XML_SCHEMAS_GYEARMONTH) && (r->mon != 1)) 23985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret->type = XML_SCHEMAS_GYEARMONTH; 23995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 24005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 24015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 24025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return ret; 24035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard} 24045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 24055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 24065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaDupVal: 24075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @v: value to duplicate 24085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 24095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * returns a duplicated value. 24105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 24115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr 24125a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaDupVal (xmlSchemaValPtr v) 24135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{ 24145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValPtr ret = xmlSchemaNewValue(v->type); 24155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (ret == NULL) 24165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return ret; 24175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 24185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard memcpy(ret, v, sizeof(xmlSchemaVal)); 24195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return ret; 24205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard} 24215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 24225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 24235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaDateNormalize: 24245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr 24255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 24265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Normalize @dt to GMT time. 24275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 24285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 24295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr 24305a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaDateNormalize (xmlSchemaValPtr dt, double offset) 24315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{ 24325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValPtr dur, ret; 24335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 24345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dt == NULL) 24355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 24365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 24375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (((dt->type != XML_SCHEMAS_TIME) && 24385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (dt->type != XML_SCHEMAS_DATETIME)) || (dt->value.date.tzo == 0)) 24395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return xmlSchemaDupVal(dt); 24405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 24415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION); 24425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dur == NULL) 24435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 24445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 24455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dur->value.date.sec -= offset; 24465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 24475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret = _xmlSchemaDateAdd(dt, dur); 24485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (ret == NULL) 24495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 24505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 24515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaFreeValue(dur); 24525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 24535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* ret->value.date.tzo = 0; */ 24545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return ret; 24555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard} 24565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 24575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 24585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * _xmlSchemaDateCastYMToDays: 24595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr 24605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 24615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Convert mon and year of @dt to total number of days. Take the 24625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * number of years since (or before) 1 AD and add the number of leap 24635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * years. This is a function because negative 24645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * years must be handled a little differently and there is no zero year. 24655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 24665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns number of days. 24675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 24685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic long 24695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard_xmlSchemaDateCastYMToDays (const xmlSchemaValPtr dt) 24705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{ 24715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard long ret; 24725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 24735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dt->value.date.year < 0) 24745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret = (dt->value.date.year * 365) + 24755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (((dt->value.date.year+1)/4)-((dt->value.date.year+1)/100)+ 24765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ((dt->value.date.year+1)/400)) + 24775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard DAY_IN_YEAR(0, dt->value.date.mon, dt->value.date.year); 24785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 24795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret = ((dt->value.date.year-1) * 365) + 24805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (((dt->value.date.year-1)/4)-((dt->value.date.year-1)/100)+ 24815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ((dt->value.date.year-1)/400)) + 24825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard DAY_IN_YEAR(0, dt->value.date.mon, dt->value.date.year); 24835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 24845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return ret; 24855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard} 24865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 24875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 24885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * TIME_TO_NUMBER: 24895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr 24905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 24915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Calculates the number of seconds in the time portion of @dt. 24925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 24935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns seconds. 24945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 24955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define TIME_TO_NUMBER(dt) \ 24965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ((double)((dt->value.date.hour * SECS_PER_HOUR) + \ 24975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (dt->value.date.min * SECS_PER_MIN)) + dt->value.date.sec) 24985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 24995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 25005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaCompareDates: 25015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @x: a first date/time value 25025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @y: a second date/time value 25035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 25045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Compare 2 date/times 25055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 25065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 25075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * case of error 25085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 25095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic int 25105a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaCompareDates (xmlSchemaValPtr x, xmlSchemaValPtr y) 25115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{ 25125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard unsigned char xmask, ymask, xor_mask, and_mask; 25135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValPtr p1, p2, q1, q2; 25145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard long p1d, p2d, q1d, q2d; 25155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 25165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((x == NULL) || (y == NULL)) 25175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -2; 25185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 25195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.tz_flag) { 25205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 25215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (!y->value.date.tz_flag) { 25225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1 = xmlSchemaDateNormalize(x, 0); 25235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day; 25245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize y + 14:00 */ 25255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1 = xmlSchemaDateNormalize(y, (14 * SECS_PER_HOUR)); 25265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 25275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day; 2528fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (p1d < q1d) { 2529fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 2530fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 25315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 2532fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else if (p1d == q1d) { 25335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard double sec; 25345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 25355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1); 2536fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (sec < 0.0) { 2537fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 2538fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 25395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 2540fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 25415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize y - 14:00 */ 25425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q2 = xmlSchemaDateNormalize(y, -(14 * SECS_PER_HOUR)); 25435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q2d = _xmlSchemaDateCastYMToDays(q2) + q2->value.date.day; 2544fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 2545fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 2546fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q2); 25475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (p1d > q2d) 25485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 25495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (p1d == q2d) { 25505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q2); 25515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (sec > 0.0) 25525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 25535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 25545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 25555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 25565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 2557fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 2558fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 2559fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 2560fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } 25615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 25625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } else if (y->value.date.tz_flag) { 25635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1 = xmlSchemaDateNormalize(y, 0); 25645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day; 25655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 25665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize x - 14:00 */ 25675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1 = xmlSchemaDateNormalize(x, -(14 * SECS_PER_HOUR)); 25685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day; 25695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 2570fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (p1d < q1d) { 2571fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 2572fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 25735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 2574fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else if (p1d == q1d) { 25755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard double sec; 25765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 25775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1); 2578fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (sec < 0.0) { 2579fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 2580fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 25815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 2582fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 25835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize x + 14:00 */ 25845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p2 = xmlSchemaDateNormalize(x, (14 * SECS_PER_HOUR)); 25855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p2d = _xmlSchemaDateCastYMToDays(p2) + p2->value.date.day; 25865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 25876560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard if (p2d > q1d) { 25886560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaFreeValue(p1); 25896560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaFreeValue(q1); 25906560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaFreeValue(p2); 25915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 25926560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard } else if (p2d == q1d) { 25935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p2) - TIME_TO_NUMBER(q1); 25946560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaFreeValue(p1); 25956560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaFreeValue(q1); 25966560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaFreeValue(p2); 25975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (sec > 0.0) 25985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 25995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 26005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 26015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 26026560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaFreeValue(p1); 26036560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaFreeValue(q1); 26046560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaFreeValue(p2); 26055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 2606fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 2607fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 2608fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 26095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 26105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 26115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 26125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* 26135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * if the same type then calculate the difference 26145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 26155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->type == y->type) { 26165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1 = xmlSchemaDateNormalize(y, 0); 26175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day; 26185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 26195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1 = xmlSchemaDateNormalize(x, 0); 26205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day; 26215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 2622fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (p1d < q1d) { 2623fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 2624fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 26255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 2626fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else if (p1d > q1d) { 2627fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 2628fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 26295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 2630fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 26315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard double sec; 26325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 26335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1); 2634fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 2635fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 26365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (sec < 0.0) 26375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 26385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (sec > 0.0) 26395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 26405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 26415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 26425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 0; 26435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 26445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 26455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard switch (x->type) { 26465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATETIME: 26475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0xf; 26485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 26495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATE: 26505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x7; 26515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 26525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEAR: 26535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x1; 26545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 26555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTH: 26565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x2; 26575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 26585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GDAY: 26595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x3; 26605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 26615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 26625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x3; 26635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 26645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 26655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x6; 26665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 26675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_TIME: 26685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x8; 26695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 26705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard default: 26715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0; 26725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 26735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 26745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 26755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard switch (y->type) { 26765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATETIME: 26775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0xf; 26785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 26795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATE: 26805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x7; 26815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 26825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEAR: 26835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x1; 26845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 26855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTH: 26865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x2; 26875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 26885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GDAY: 26895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x3; 26905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 26915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 26925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x3; 26935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 26945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 26955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x6; 26965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 26975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_TIME: 26985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x8; 26995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 27005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard default: 27015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0; 27025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 27035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 27045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 27055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xor_mask = xmask ^ ymask; /* mark type differences */ 27065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard and_mask = xmask & ymask; /* mark field specification */ 27075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 27085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* year */ 27095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (xor_mask & 1) 27105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 27115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (and_mask & 1) { 27125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.year < y->value.date.year) 27135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 27145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.year > y->value.date.year) 27155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 27165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 27175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 27185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* month */ 27195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (xor_mask & 2) 27205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 27215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (and_mask & 2) { 27225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.mon < y->value.date.mon) 27235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 27245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.mon > y->value.date.mon) 27255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 27265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 27275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 27285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* day */ 27295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (xor_mask & 4) 27305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 27315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (and_mask & 4) { 27325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.day < y->value.date.day) 27335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 27345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.day > y->value.date.day) 27355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 27365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 27375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 27385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* time */ 27395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (xor_mask & 8) 27405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 27415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (and_mask & 8) { 27425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.hour < y->value.date.hour) 27435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 27445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.hour > y->value.date.hour) 27455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 27465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.min < y->value.date.min) 27475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 27485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.min > y->value.date.min) 27495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 27505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.sec < y->value.date.sec) 27515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 27525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.sec > y->value.date.sec) 27535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 27545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 27555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 2756070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 2757070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 2758070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 2759070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 2760c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * xmlSchemaCompareNormStrings: 2761c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @x: a first string value 2762c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @y: a second string value 2763c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * 2764c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Compare 2 string for their normalized values. 2765c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * 2766c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in 2767c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * case of error 2768c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard */ 2769c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillardstatic int 2770c4c215519fae43487ab55bbe1f923646af40d306Daniel VeillardxmlSchemaCompareNormStrings(xmlSchemaValPtr x, xmlSchemaValPtr y) { 2771c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard const xmlChar *utf1; 2772c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard const xmlChar *utf2; 2773c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard int tmp; 2774c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 2775c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((x == NULL) || (y == NULL)) 2776c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-2); 2777c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf1 = x->value.str; 2778c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf2 = y->value.str; 2779c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 2780c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard while (IS_BLANK(*utf1)) utf1++; 2781c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard while (IS_BLANK(*utf2)) utf2++; 2782c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard while ((*utf1 != 0) && (*utf2 != 0)) { 2783c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (IS_BLANK(*utf1)) { 2784c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (!IS_BLANK(*utf2)) { 2785c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard tmp = *utf1 - *utf2; 2786c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(tmp); 2787c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 2788c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard while (IS_BLANK(*utf1)) utf1++; 2789c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard while (IS_BLANK(*utf2)) utf2++; 2790c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } else { 2791c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard tmp = *utf1++ - *utf2++; 2792c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (tmp < 0) 2793c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 2794c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (tmp > 0) 2795c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(1); 2796c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 2797c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 2798c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (*utf1 != 0) { 2799c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard while (IS_BLANK(*utf1)) utf1++; 2800c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (*utf1 != 0) 2801c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(1); 2802c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 2803c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (*utf2 != 0) { 2804c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard while (IS_BLANK(*utf2)) utf2++; 2805c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (*utf2 != 0) 2806c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 2807c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 2808c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(0); 2809c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard} 2810c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 2811c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard/** 2812b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaCompareFloats: 2813b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @x: a first float or double value 2814b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @y: a second float or double value 2815b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 2816b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Compare 2 values 2817b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 2818b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 2819b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * case of error 2820b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 2821b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic int 2822b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaCompareFloats(xmlSchemaValPtr x, xmlSchemaValPtr y) { 2823b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard double d1, d2; 2824b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 2825b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((x == NULL) || (y == NULL)) 2826b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-2); 2827b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 2828b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard /* 2829b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Cast everything to doubles. 2830b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 2831b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (x->type == XML_SCHEMAS_DOUBLE) 2832b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard d1 = x->value.d; 2833b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else if (x->type == XML_SCHEMAS_FLOAT) 2834b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard d1 = x->value.f; 2835b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else 2836b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-2); 2837b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 2838b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (y->type == XML_SCHEMAS_DOUBLE) 2839b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard d2 = y->value.d; 2840b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else if (y->type == XML_SCHEMAS_FLOAT) 2841b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard d2 = y->value.f; 2842b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else 2843b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-2); 2844b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 2845b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard /* 2846b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check for special cases. 2847b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 2848b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (xmlXPathIsNaN(d1)) { 2849b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (xmlXPathIsNaN(d2)) 2850b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 2851b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 2852b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 2853b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (xmlXPathIsNaN(d2)) 2854b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 2855b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 == xmlXPathPINF) { 2856b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d2 == xmlXPathPINF) 2857b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 2858b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 2859b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 2860b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d2 == xmlXPathPINF) 2861b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 2862b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 == xmlXPathNINF) { 2863b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d2 == xmlXPathNINF) 2864b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 2865b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 2866b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 2867b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d2 == xmlXPathNINF) 2868b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 2869b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 2870b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard /* 2871b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * basic tests, the last one we should have equality, but 2872b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * portability is more important than speed and handling 2873b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * NaN or Inf in a portable way is always a challenge, so ... 2874b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 2875b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 < d2) 2876b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 2877b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 > d2) 2878b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 2879b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 == d2) 2880b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 2881b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(2); 2882b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard} 2883b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 2884b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/** 28854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCompareValues: 28864255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @x: a first value 28874255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @y: a second value 28884255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 28894255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Compare 2 values 28904255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 28915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 28925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * case of error 28934255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 289480b19092f24410a6b869abf519227686e8f207caDaniel Veillardint 28954255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaCompareValues(xmlSchemaValPtr x, xmlSchemaValPtr y) { 28964255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if ((x == NULL) || (y == NULL)) 28974255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(-2); 28984255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 28994255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard switch (x->type) { 290080b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_UNKNOWN: 290180b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(-2); 290280b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_INTEGER: 290380b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NPINTEGER: 290480b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NINTEGER: 290580b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NNINTEGER: 290680b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_PINTEGER: 290780b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_INT: 290880b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_UINT: 290980b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_LONG: 291080b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_ULONG: 291180b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_SHORT: 291280b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_USHORT: 291380b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_BYTE: 291480b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_UBYTE: 29154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard case XML_SCHEMAS_DECIMAL: 291680b19092f24410a6b869abf519227686e8f207caDaniel Veillard if (y->type == x->type) 291780b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(xmlSchemaCompareDecimals(x, y)); 291880b19092f24410a6b869abf519227686e8f207caDaniel Veillard if ((y->type == XML_SCHEMAS_DECIMAL) || 291980b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_INTEGER) || 292080b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_NPINTEGER) || 292180b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_NINTEGER) || 292280b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_NNINTEGER) || 292380b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_PINTEGER) || 292480b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_INT) || 292580b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_UINT) || 292680b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_LONG) || 292780b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_ULONG) || 292880b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_SHORT) || 292980b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_USHORT) || 293080b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_BYTE) || 293180b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_UBYTE)) 29324255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(xmlSchemaCompareDecimals(x, y)); 29335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return(-2); 2934070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case XML_SCHEMAS_DURATION: 2935070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (y->type == XML_SCHEMAS_DURATION) 2936070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(xmlSchemaCompareDurations(x, y)); 29375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return(-2); 29385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_TIME: 29395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GDAY: 29405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTH: 29415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 29425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEAR: 29435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 29445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATE: 29455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATETIME: 29465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((y->type == XML_SCHEMAS_DATETIME) || 29475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (y->type == XML_SCHEMAS_TIME) || 29485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (y->type == XML_SCHEMAS_GDAY) || 29495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (y->type == XML_SCHEMAS_GMONTH) || 29505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (y->type == XML_SCHEMAS_GMONTHDAY) || 29515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (y->type == XML_SCHEMAS_GYEAR) || 29525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (y->type == XML_SCHEMAS_DATE) || 29535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (y->type == XML_SCHEMAS_GYEARMONTH)) 29545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return (xmlSchemaCompareDates(x, y)); 29555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return (-2); 295680b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NORMSTRING: 295780b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_TOKEN: 295880b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_LANGUAGE: 295980b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NMTOKEN: 296080b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NAME: 296180b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NCNAME: 296280b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_ID: 296380b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_IDREF: 296480b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_ENTITY: 296580b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NOTATION: 296680b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_ANYURI: 2967c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((y->type == XML_SCHEMAS_NORMSTRING) || 2968c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_TOKEN) || 2969c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_LANGUAGE) || 2970c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_NMTOKEN) || 2971c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_NAME) || 2972c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_QNAME) || 2973c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_NCNAME) || 2974c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_ID) || 2975c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_IDREF) || 2976c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_ENTITY) || 2977c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_NOTATION) || 2978c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_ANYURI)) 2979c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return (xmlSchemaCompareNormStrings(x, y)); 2980c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return (-2); 2981e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_QNAME: 2982e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (y->type == XML_SCHEMAS_QNAME) { 2983e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((xmlStrEqual(x->value.qname.name, y->value.qname.name)) && 2984e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (xmlStrEqual(x->value.qname.uri, y->value.qname.uri))) 2985e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return(0); 2986e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return(2); 2987e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 2988e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return (-2); 2989c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_FLOAT: 2990c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_DOUBLE: 2991b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((y->type == XML_SCHEMAS_FLOAT) || 2992b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard (y->type == XML_SCHEMAS_DOUBLE)) 2993b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return (xmlSchemaCompareFloats(x, y)); 2994b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return (-2); 29954255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard TODO 2996c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard break; 2997c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_BOOLEAN: 2998b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (y->type == XML_SCHEMAS_BOOLEAN) { 2999b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (x->value.b == y->value.b) 3000b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 3001b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (x->value.b == 0) 3002b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 3003b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 3004b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 3005b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return (-2); 3006c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_STRING: 3007c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_IDREFS: 3008c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_ENTITIES: 3009c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_NMTOKENS: 3010c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard TODO 3011c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard break; 30124255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 30135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -2; 30144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 30154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 30164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 3017c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * xmlSchemaNormLen: 3018c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @value: a string 3019c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * 3020c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Computes the UTF8 length of the normalized value of the string 3021c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * 3022c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Returns the length or -1 in case of error. 3023c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard */ 3024c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillardstatic int 3025c4c215519fae43487ab55bbe1f923646af40d306Daniel VeillardxmlSchemaNormLen(const xmlChar *value) { 3026c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard const xmlChar *utf; 3027c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard int ret = 0; 3028c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 3029c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (value == NULL) 3030c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 3031c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf = value; 3032c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard while (IS_BLANK(*utf)) utf++; 3033c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard while (*utf != 0) { 3034c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (utf[0] & 0x80) { 3035c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[1] & 0xc0) != 0x80) 3036c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 3037c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[0] & 0xe0) == 0xe0) { 3038c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[2] & 0xc0) != 0x80) 3039c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 3040c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[0] & 0xf0) == 0xf0) { 3041c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[0] & 0xf8) != 0xf0 || (utf[3] & 0xc0) != 0x80) 3042c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 3043c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf += 4; 3044c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } else { 3045c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf += 3; 3046c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 3047c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } else { 3048c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf += 2; 3049c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 3050c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } else if (IS_BLANK(*utf)) { 3051c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard while (IS_BLANK(*utf)) utf++; 3052c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (*utf == 0) 3053c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard break; 3054c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } else { 3055c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf++; 3056c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 3057c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard ret++; 3058c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 3059c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(ret); 3060c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard} 3061c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 3062c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard/** 30634255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaValidateFacet: 306401c13b5be2d249ef66d86585adee87901bb8efa2Daniel Veillard * @base: the base type 30654255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @facet: the facet to check 30664255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value: the lexical repr of the value to validate 30674255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @val: the precomputed value 30684255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 30694255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Check a value against a facet condition 30704255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 30714255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns 0 if the element is schemas valid, a positive error code 30724255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * number otherwise and -1 in case of internal or API error. 30734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 30744255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardint 3075dda8f1ba9fb2e731e2dd6aa325ed07add7905ec3Daniel VeillardxmlSchemaValidateFacet(xmlSchemaTypePtr base ATTRIBUTE_UNUSED, 3076118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard xmlSchemaFacetPtr facet, 30774255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard const xmlChar *value, xmlSchemaValPtr val) 30784255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard{ 30794255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard int ret; 30804255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 30814255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard switch (facet->type) { 30824255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard case XML_SCHEMA_FACET_PATTERN: 30834255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard ret = xmlRegexpExec(facet->regexp, value); 30844255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (ret == 1) 30854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(0); 30864255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (ret == 0) { 30878bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard /* TODO error code */ 30884255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(1); 30894255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 30904255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(ret); 30914255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard case XML_SCHEMA_FACET_MAXEXCLUSIVE: 30924255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard ret = xmlSchemaCompareValues(val, facet->val); 30934255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (ret == -2) { 30948bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard /* TODO error code */ 30954255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(-1); 30964255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 30974255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (ret == -1) 30984255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(0); 30995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* error code */ 31004255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(1); 3101070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case XML_SCHEMA_FACET_MAXINCLUSIVE: 3102070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = xmlSchemaCompareValues(val, facet->val); 3103070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == -2) { 31048bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard /* TODO error code */ 3105070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(-1); 3106070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 3107070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((ret == -1) || (ret == 0)) 3108070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(0); 31095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* error code */ 3110070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(1); 3111070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case XML_SCHEMA_FACET_MINEXCLUSIVE: 3112070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = xmlSchemaCompareValues(val, facet->val); 3113070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == -2) { 31148bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard /* TODO error code */ 3115070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(-1); 3116070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 3117070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == 1) 3118070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(0); 31195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* error code */ 3120070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(1); 3121070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case XML_SCHEMA_FACET_MININCLUSIVE: 3122070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = xmlSchemaCompareValues(val, facet->val); 3123070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == -2) { 31248bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard /* TODO error code */ 3125070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(-1); 3126070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 3127070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((ret == 1) || (ret == 0)) 3128070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(0); 31295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* error code */ 3130070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(1); 31318651f5365c182ce5c52fe1cdc2b9d72b2ecc34e2Daniel Veillard case XML_SCHEMA_FACET_WHITESPACE: 31328bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard /* TODO whitespaces */ 31338651f5365c182ce5c52fe1cdc2b9d72b2ecc34e2Daniel Veillard return(0); 31348bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard case XML_SCHEMA_FACET_ENUMERATION: 31358bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard if ((facet->value != NULL) && 31368bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard (xmlStrEqual(facet->value, value))) 31378bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard return(0); 31388bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard return(1); 31398bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard case XML_SCHEMA_FACET_LENGTH: 3140e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard case XML_SCHEMA_FACET_MAXLENGTH: 31418bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard case XML_SCHEMA_FACET_MINLENGTH: { 31428bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard unsigned int len = 0; 3143e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard 31448bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard if ((facet->val == NULL) || 3145e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((facet->val->type != XML_SCHEMAS_DECIMAL) && 3146e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (facet->val->type != XML_SCHEMAS_NNINTEGER)) || 31478bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard (facet->val->value.decimal.frac != 0)) { 31488bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard return(-1); 31498bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } 31508bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard switch (base->flags) { 3151c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_IDREF: 31528bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard case XML_SCHEMAS_NORMSTRING: 31538bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard case XML_SCHEMAS_TOKEN: 31548bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard case XML_SCHEMAS_LANGUAGE: 31558bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard case XML_SCHEMAS_NMTOKEN: 31568bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard case XML_SCHEMAS_NAME: 31578bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard case XML_SCHEMAS_NCNAME: 31588bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard case XML_SCHEMAS_ID: 3159c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard len = xmlSchemaNormLen(value); 3160c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard break; 3161c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_STRING: 31628bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard len = xmlUTF8Strlen(value); 31638bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard break; 31648bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard default: 31658bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard TODO 31668bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } 31678bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard if (facet->type == XML_SCHEMA_FACET_LENGTH) { 3168e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (len != facet->val->value.decimal.lo) 31698bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard return(1); 31708bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) { 3171e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (len < facet->val->value.decimal.lo) 3172e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard return(1); 31738bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } else { 3174e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (len > facet->val->value.decimal.lo) 3175e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard return(1); 3176e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard } 31778bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard break; 31788bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } 31794255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard default: 31804255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard TODO 31814255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 31824255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(0); 3183b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 31844255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 31854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 31864255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#endif /* LIBXML_SCHEMAS_ENABLED */ 3187