1ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
2ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * schemastypes.c : implementation of the XML Schema Datatypes
3ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *             definition and validity checking
4ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * See Copyright for the status of this software.
6ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Daniel Veillard <veillard@redhat.com>
8ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IN_LIBXML
11ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "libxml.h"
12ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_SCHEMAS_ENABLED
14ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <string.h>
16ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlmemory.h>
17ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/parser.h>
18ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/parserInternals.h>
19ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/hash.h>
20ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/valid.h>
21ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xpath.h>
22ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/uri.h>
23ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlschemas.h>
25ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/schemasInternals.h>
26ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlschemastypes.h>
27ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_MATH_H
29ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <math.h>
30ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
31ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_FLOAT_H
32ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <float.h>
33ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
34ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
35ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG
36ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
37ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef LIBXML_XPATH_ENABLED
38ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectextern double xmlXPathNAN;
39ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectextern double xmlXPathPINF;
40ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectextern double xmlXPathNINF;
41ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
42ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#define TODO								\
44ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,				\
45ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "Unimplemented block at %s:%d\n",				\
46ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            __FILE__, __LINE__);
47ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
48ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMAS_NAMESPACE_NAME \
49ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    (const xmlChar *)"http://www.w3.org/2001/XMLSchema"
50ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
51ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_WSP_REPLACE_CH(c)	((((c) == 0x9) || ((c) == 0xa)) || \
52ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 ((c) == 0xd))
53ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
54ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_WSP_SPACE_CH(c)	((c) == 0x20)
55ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
56ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_WSP_BLANK_CH(c) IS_BLANK_CH(c)
57ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
58ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* Date value */
59ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaValDate xmlSchemaValDate;
60ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaValDate *xmlSchemaValDatePtr;
61ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaValDate {
62ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    long		year;
63ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned int	mon	:4;	/* 1 <=  mon    <= 12   */
64ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned int	day	:5;	/* 1 <=  day    <= 31   */
65ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned int	hour	:5;	/* 0 <=  hour   <= 23   */
66ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned int	min	:6;	/* 0 <=  min    <= 59	*/
67ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double		sec;
68ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned int	tz_flag	:1;	/* is tzo explicitely set? */
69ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    signed int		tzo	:12;	/* -1440 <= tzo <= 1440;
70ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					   currently only -840 to +840 are needed */
71ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
72ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
73ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* Duration value */
74ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaValDuration xmlSchemaValDuration;
75ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaValDuration *xmlSchemaValDurationPtr;
76ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaValDuration {
77ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    long	        mon;		/* mon stores years also */
7894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    long	day;
79ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double		sec;            /* sec stores min and hour also */
80ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
81ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
82ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaValDecimal xmlSchemaValDecimal;
83ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaValDecimal *xmlSchemaValDecimalPtr;
84ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaValDecimal {
85ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* would use long long but not portable */
86ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned long lo;
87ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned long mi;
88ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned long hi;
89ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned int extra;
90ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned int sign:1;
91ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned int frac:7;
92ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned int total:8;
93ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
94ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
95ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaValQName xmlSchemaValQName;
96ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaValQName *xmlSchemaValQNamePtr;
97ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaValQName {
98ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *name;
99ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *uri;
100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaValHex xmlSchemaValHex;
103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaValHex *xmlSchemaValHexPtr;
104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaValHex {
105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar     *str;
106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned int total;
107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaValBase64 xmlSchemaValBase64;
110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaValBase64 *xmlSchemaValBase64Ptr;
111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaValBase64 {
112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar     *str;
113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned int total;
114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaVal {
117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValType type;
118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    struct _xmlSchemaVal *next;
119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    union {
120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaValDecimal     decimal;
121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaValDate        date;
122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaValDuration    dur;
123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaValQName	qname;
124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaValHex		hex;
125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaValBase64	base64;
126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	float			f;
127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	double			d;
128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int			b;
129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar                *str;
130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } value;
131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlSchemaTypesInitialized = 0;
134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlHashTablePtr xmlSchemaTypesBank = NULL;
135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Basic types
138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeStringDef = NULL;
140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeAnyTypeDef = NULL;
141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeAnySimpleTypeDef = NULL;
142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeDecimalDef = NULL;
143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeDatetimeDef = NULL;
144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeDateDef = NULL;
145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeTimeDef = NULL;
146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeGYearDef = NULL;
147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeGYearMonthDef = NULL;
148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeGDayDef = NULL;
149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeGMonthDayDef = NULL;
150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeGMonthDef = NULL;
151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeDurationDef = NULL;
152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeFloatDef = NULL;
153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeBooleanDef = NULL;
154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeDoubleDef = NULL;
155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeHexBinaryDef = NULL;
156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeBase64BinaryDef = NULL;
157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeAnyURIDef = NULL;
158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Derived types
161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypePositiveIntegerDef = NULL;
163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeNonPositiveIntegerDef = NULL;
164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeNegativeIntegerDef = NULL;
165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeNonNegativeIntegerDef = NULL;
166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeIntegerDef = NULL;
167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeLongDef = NULL;
168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeIntDef = NULL;
169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeShortDef = NULL;
170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeByteDef = NULL;
171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedLongDef = NULL;
172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedIntDef = NULL;
173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedShortDef = NULL;
174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedByteDef = NULL;
175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeNormStringDef = NULL;
176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeTokenDef = NULL;
177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeLanguageDef = NULL;
178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeNameDef = NULL;
179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeQNameDef = NULL;
180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeNCNameDef = NULL;
181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeIdDef = NULL;
182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeIdrefDef = NULL;
183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeIdrefsDef = NULL;
184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeEntityDef = NULL;
185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeEntitiesDef = NULL;
186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeNotationDef = NULL;
187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeNmtokenDef = NULL;
188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaTypeNmtokensDef = NULL;
189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
19294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *			Datatype error handlers				*
193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaTypeErrMemory:
197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra:  extra informations
198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle an out of memory condition
200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaTypeErrMemory(xmlNodePtr node, const char *extra)
203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    __xmlSimpleError(XML_FROM_DATATYPE, XML_ERR_NO_MEMORY, node, NULL, extra);
205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
20994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *			Base types support				*
210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaNewValue:
215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the value type
216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new simple type value
218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a pointer to the new value or NULL in case of error
220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaValPtr
222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaNewValue(xmlSchemaValType type) {
223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValPtr value;
224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    value = (xmlSchemaValPtr) xmlMalloc(sizeof(xmlSchemaVal));
226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (value == NULL) {
227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(value, 0, sizeof(xmlSchemaVal));
230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    value->type = type;
231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(value);
232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaFacetPtr
235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaNewMinLengthFacet(int value)
236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFacetPtr ret;
238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaNewFacet();
240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XML_SCHEMA_FACET_MINLENGTH;
244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->val = xmlSchemaNewValue(XML_SCHEMAS_NNINTEGER);
245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->val->value.decimal.lo = value;
246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaInitBasicType:
251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the type name
252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the value type associated
253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Initialize one primitive built-in type
255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr
25794442ad4107000e6d49f9b85a46a591495a57632Selim GurunxmlSchemaInitBasicType(const char *name, xmlSchemaValType type,
258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlSchemaTypePtr baseType) {
259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr ret;
260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaTypePtr) xmlMalloc(sizeof(xmlSchemaType));
262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaTypeErrMemory(NULL, "could not initialize basic types");
264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaType));
267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->name = (const xmlChar *)name;
268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->targetNamespace = XML_SCHEMAS_NAMESPACE_NAME;
269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XML_SCHEMA_TYPE_BASIC;
27094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    ret->baseType = baseType;
271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->contentType = XML_SCHEMA_CONTENT_BASIC;
272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Primitive types.
274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
27594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    switch (type) {
27694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	case XML_SCHEMAS_STRING:
27794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	case XML_SCHEMAS_DECIMAL:
27894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	case XML_SCHEMAS_DATE:
27994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	case XML_SCHEMAS_DATETIME:
28094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	case XML_SCHEMAS_TIME:
28194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	case XML_SCHEMAS_GYEAR:
28294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	case XML_SCHEMAS_GYEARMONTH:
28394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	case XML_SCHEMAS_GMONTH:
28494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	case XML_SCHEMAS_GMONTHDAY:
28594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	case XML_SCHEMAS_GDAY:
28694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	case XML_SCHEMAS_DURATION:
28794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	case XML_SCHEMAS_FLOAT:
28894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	case XML_SCHEMAS_DOUBLE:
28994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	case XML_SCHEMAS_BOOLEAN:
29094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	case XML_SCHEMAS_ANYURI:
29194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	case XML_SCHEMAS_HEXBINARY:
29294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	case XML_SCHEMAS_BASE64BINARY:
29394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	case XML_SCHEMAS_QNAME:
29494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	case XML_SCHEMAS_NOTATION:
295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->flags |= XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE;
296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Set variety.
302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (type) {
304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_ANYTYPE:
305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_ANYSIMPLETYPE:
306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_IDREFS:
308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_NMTOKENS:
309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_ENTITIES:
310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->flags |= XML_SCHEMAS_TYPE_VARIETY_LIST;
311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->facets = xmlSchemaNewMinLengthFacet(1);
31294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    ret->flags |= XML_SCHEMAS_TYPE_HAS_FACETS;
313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->flags |= XML_SCHEMAS_TYPE_VARIETY_ATOMIC;
316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlHashAddEntry2(xmlSchemaTypesBank, ret->name,
319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	             XML_SCHEMAS_NAMESPACE_NAME, ret);
320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->builtInType = type;
321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* WARNING: Those type reside normally in xmlschemas.c but are
326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* redefined here locally in oder of being able to use them for xs:anyType-
327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* TODO: Remove those definition if we move the types to a header file.
328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* TODO: Always keep those structs up-to-date with the originals.
329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define UNBOUNDED (1 << 30)
331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaTreeItem xmlSchemaTreeItem;
333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaTreeItem *xmlSchemaTreeItemPtr;
334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaTreeItem {
335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeType type;
336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAnnotPtr annot;
337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTreeItemPtr next;
338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTreeItemPtr children;
339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaParticle xmlSchemaParticle;
342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaParticle *xmlSchemaParticlePtr;
343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaParticle {
344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeType type;
345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAnnotPtr annot;
346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTreeItemPtr next;
347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTreeItemPtr children;
348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int minOccurs;
349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int maxOccurs;
350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr node;
351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaModelGroup xmlSchemaModelGroup;
354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaModelGroup *xmlSchemaModelGroupPtr;
355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaModelGroup {
356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeType type;
357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAnnotPtr annot;
358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTreeItemPtr next;
359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTreeItemPtr children;
360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr node;
361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaParticlePtr
364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAddParticle(void)
365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParticlePtr ret = NULL;
367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaParticlePtr)
369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlMalloc(sizeof(xmlSchemaParticle));
370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypeErrMemory(NULL, "allocating particle component");
372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaParticle));
375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XML_SCHEMA_TYPE_PARTICLE;
376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->minOccurs = 1;
377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->maxOccurs = 1;
378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaInitTypes:
383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Initialize the default XML Schemas type library
385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaInitTypes(void)
388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaTypesInitialized != 0)
390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypesBank = xmlHashCreate(40);
392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
39394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 3.4.7 Built-in Complex Type Definition
396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeAnyTypeDef = xmlSchemaInitBasicType("anyType",
39894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun                                                     XML_SCHEMAS_ANYTYPE,
399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						     NULL);
400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeAnyTypeDef->baseType = xmlSchemaTypeAnyTypeDef;
401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeAnyTypeDef->contentType = XML_SCHEMA_CONTENT_MIXED;
402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Init the content type.
404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
40594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    xmlSchemaTypeAnyTypeDef->contentType = XML_SCHEMA_CONTENT_MIXED;
406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaParticlePtr particle;
408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaModelGroupPtr sequence;
409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaWildcardPtr wild;
410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* First particle. */
411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	particle = xmlSchemaAddParticle();
412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (particle == NULL)
413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypeAnyTypeDef->subtypes = (xmlSchemaTypePtr) particle;
415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* Sequence model group. */
416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	sequence = (xmlSchemaModelGroupPtr)
417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlMalloc(sizeof(xmlSchemaModelGroup));
418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (sequence == NULL) {
419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaTypeErrMemory(NULL, "allocating model group component");
420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memset(sequence, 0, sizeof(xmlSchemaModelGroup));
42394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	sequence->type = XML_SCHEMA_TYPE_SEQUENCE;
424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	particle->children = (xmlSchemaTreeItemPtr) sequence;
425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* Second particle. */
426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	particle = xmlSchemaAddParticle();
427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (particle == NULL)
428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	particle->minOccurs = 0;
430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	particle->maxOccurs = UNBOUNDED;
431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	sequence->children = (xmlSchemaTreeItemPtr) particle;
432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* The wildcard */
433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	wild = (xmlSchemaWildcardPtr) xmlMalloc(sizeof(xmlSchemaWildcard));
434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (wild == NULL) {
435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaTypeErrMemory(NULL, "allocating wildcard component");
436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memset(wild, 0, sizeof(xmlSchemaWildcard));
439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	wild->type = XML_SCHEMA_TYPE_ANY;
44094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	wild->any = 1;
44194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	wild->processContents = XML_SCHEMAS_ANY_LAX;
44294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	particle->children = (xmlSchemaTreeItemPtr) wild;
443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Create the attribute wildcard.
445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	wild = (xmlSchemaWildcardPtr) xmlMalloc(sizeof(xmlSchemaWildcard));
447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (wild == NULL) {
448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaTypeErrMemory(NULL, "could not create an attribute "
449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"wildcard on anyType");
450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memset(wild, 0, sizeof(xmlSchemaWildcard));
453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	wild->any = 1;
45494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	wild->processContents = XML_SCHEMAS_ANY_LAX;
455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypeAnyTypeDef->attributeWildcard = wild;
456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
45794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    xmlSchemaTypeAnySimpleTypeDef = xmlSchemaInitBasicType("anySimpleType",
458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                           XML_SCHEMAS_ANYSIMPLETYPE,
459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project							   xmlSchemaTypeAnyTypeDef);
460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * primitive datatypes
462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeStringDef = xmlSchemaInitBasicType("string",
464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                    XML_SCHEMAS_STRING,
465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						    xmlSchemaTypeAnySimpleTypeDef);
466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeDecimalDef = xmlSchemaInitBasicType("decimal",
467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                     XML_SCHEMAS_DECIMAL,
468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						     xmlSchemaTypeAnySimpleTypeDef);
469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeDateDef = xmlSchemaInitBasicType("date",
470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                  XML_SCHEMAS_DATE,
471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						  xmlSchemaTypeAnySimpleTypeDef);
472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeDatetimeDef = xmlSchemaInitBasicType("dateTime",
473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                      XML_SCHEMAS_DATETIME,
474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						      xmlSchemaTypeAnySimpleTypeDef);
475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeTimeDef = xmlSchemaInitBasicType("time",
476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                  XML_SCHEMAS_TIME,
477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						  xmlSchemaTypeAnySimpleTypeDef);
478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeGYearDef = xmlSchemaInitBasicType("gYear",
479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   XML_SCHEMAS_GYEAR,
480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						   xmlSchemaTypeAnySimpleTypeDef);
481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeGYearMonthDef = xmlSchemaInitBasicType("gYearMonth",
482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                        XML_SCHEMAS_GYEARMONTH,
483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project							xmlSchemaTypeAnySimpleTypeDef);
484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeGMonthDef = xmlSchemaInitBasicType("gMonth",
485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                    XML_SCHEMAS_GMONTH,
486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						    xmlSchemaTypeAnySimpleTypeDef);
487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeGMonthDayDef = xmlSchemaInitBasicType("gMonthDay",
488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                       XML_SCHEMAS_GMONTHDAY,
489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						       xmlSchemaTypeAnySimpleTypeDef);
490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeGDayDef = xmlSchemaInitBasicType("gDay",
491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                  XML_SCHEMAS_GDAY,
492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						  xmlSchemaTypeAnySimpleTypeDef);
493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeDurationDef = xmlSchemaInitBasicType("duration",
494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                      XML_SCHEMAS_DURATION,
495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						      xmlSchemaTypeAnySimpleTypeDef);
496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeFloatDef = xmlSchemaInitBasicType("float",
497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   XML_SCHEMAS_FLOAT,
498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						   xmlSchemaTypeAnySimpleTypeDef);
499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeDoubleDef = xmlSchemaInitBasicType("double",
500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                    XML_SCHEMAS_DOUBLE,
501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						    xmlSchemaTypeAnySimpleTypeDef);
502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeBooleanDef = xmlSchemaInitBasicType("boolean",
503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                     XML_SCHEMAS_BOOLEAN,
504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						     xmlSchemaTypeAnySimpleTypeDef);
505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeAnyURIDef = xmlSchemaInitBasicType("anyURI",
506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                    XML_SCHEMAS_ANYURI,
507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						    xmlSchemaTypeAnySimpleTypeDef);
508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeHexBinaryDef = xmlSchemaInitBasicType("hexBinary",
509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                     XML_SCHEMAS_HEXBINARY,
510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						     xmlSchemaTypeAnySimpleTypeDef);
511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeBase64BinaryDef
512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        = xmlSchemaInitBasicType("base64Binary", XML_SCHEMAS_BASE64BINARY,
513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypeAnySimpleTypeDef);
514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeNotationDef = xmlSchemaInitBasicType("NOTATION",
515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                    XML_SCHEMAS_NOTATION,
51694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun						    xmlSchemaTypeAnySimpleTypeDef);
517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeQNameDef = xmlSchemaInitBasicType("QName",
518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   XML_SCHEMAS_QNAME,
519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						   xmlSchemaTypeAnySimpleTypeDef);
520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * derived datatypes
523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeIntegerDef = xmlSchemaInitBasicType("integer",
525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                     XML_SCHEMAS_INTEGER,
526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						     xmlSchemaTypeDecimalDef);
527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeNonPositiveIntegerDef =
528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaInitBasicType("nonPositiveInteger",
529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               XML_SCHEMAS_NPINTEGER,
530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlSchemaTypeIntegerDef);
531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeNegativeIntegerDef =
532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaInitBasicType("negativeInteger", XML_SCHEMAS_NINTEGER,
533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypeNonPositiveIntegerDef);
534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeLongDef =
535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaInitBasicType("long", XML_SCHEMAS_LONG,
536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypeIntegerDef);
537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeIntDef = xmlSchemaInitBasicType("int", XML_SCHEMAS_INT,
538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypeLongDef);
539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeShortDef = xmlSchemaInitBasicType("short",
540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   XML_SCHEMAS_SHORT,
541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						   xmlSchemaTypeIntDef);
542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeByteDef = xmlSchemaInitBasicType("byte",
543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                  XML_SCHEMAS_BYTE,
544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						  xmlSchemaTypeShortDef);
545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeNonNegativeIntegerDef =
546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaInitBasicType("nonNegativeInteger",
547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               XML_SCHEMAS_NNINTEGER,
548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlSchemaTypeIntegerDef);
549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeUnsignedLongDef =
550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaInitBasicType("unsignedLong", XML_SCHEMAS_ULONG,
551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypeNonNegativeIntegerDef);
552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeUnsignedIntDef =
553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaInitBasicType("unsignedInt", XML_SCHEMAS_UINT,
554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypeUnsignedLongDef);
555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeUnsignedShortDef =
556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaInitBasicType("unsignedShort", XML_SCHEMAS_USHORT,
557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypeUnsignedIntDef);
558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeUnsignedByteDef =
559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaInitBasicType("unsignedByte", XML_SCHEMAS_UBYTE,
560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypeUnsignedShortDef);
561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePositiveIntegerDef =
562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaInitBasicType("positiveInteger", XML_SCHEMAS_PINTEGER,
563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypeNonNegativeIntegerDef);
564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeNormStringDef = xmlSchemaInitBasicType("normalizedString",
565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                        XML_SCHEMAS_NORMSTRING,
566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project							xmlSchemaTypeStringDef);
567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeTokenDef = xmlSchemaInitBasicType("token",
568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   XML_SCHEMAS_TOKEN,
569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						   xmlSchemaTypeNormStringDef);
570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeLanguageDef = xmlSchemaInitBasicType("language",
571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                      XML_SCHEMAS_LANGUAGE,
572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						      xmlSchemaTypeTokenDef);
573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeNameDef = xmlSchemaInitBasicType("Name",
574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                  XML_SCHEMAS_NAME,
575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						  xmlSchemaTypeTokenDef);
576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeNmtokenDef = xmlSchemaInitBasicType("NMTOKEN",
577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                     XML_SCHEMAS_NMTOKEN,
578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						     xmlSchemaTypeTokenDef);
579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeNCNameDef = xmlSchemaInitBasicType("NCName",
580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                    XML_SCHEMAS_NCNAME,
581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						    xmlSchemaTypeNameDef);
582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeIdDef = xmlSchemaInitBasicType("ID", XML_SCHEMAS_ID,
583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						    xmlSchemaTypeNCNameDef);
584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeIdrefDef = xmlSchemaInitBasicType("IDREF",
585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   XML_SCHEMAS_IDREF,
58694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun						   xmlSchemaTypeNCNameDef);
587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeEntityDef = xmlSchemaInitBasicType("ENTITY",
588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                    XML_SCHEMAS_ENTITY,
589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						    xmlSchemaTypeNCNameDef);
590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Derived list types.
592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* ENTITIES */
594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeEntitiesDef = xmlSchemaInitBasicType("ENTITIES",
595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                      XML_SCHEMAS_ENTITIES,
596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						      xmlSchemaTypeAnySimpleTypeDef);
597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeEntitiesDef->subtypes = xmlSchemaTypeEntityDef;
598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* IDREFS */
599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeIdrefsDef = xmlSchemaInitBasicType("IDREFS",
600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                    XML_SCHEMAS_IDREFS,
601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						    xmlSchemaTypeAnySimpleTypeDef);
602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeIdrefsDef->subtypes = xmlSchemaTypeIdrefDef;
603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* NMTOKENS */
605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeNmtokensDef = xmlSchemaInitBasicType("NMTOKENS",
606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                      XML_SCHEMAS_NMTOKENS,
607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						      xmlSchemaTypeAnySimpleTypeDef);
608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeNmtokensDef->subtypes = xmlSchemaTypeNmtokenDef;
609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypesInitialized = 1;
611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCleanupTypes:
615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup the default XML Schemas type library
617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
61894442ad4107000e6d49f9b85a46a591495a57632Selim Gurunvoid
619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCleanupTypes(void) {
620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaTypesInitialized == 0)
621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Free xs:anyType.
624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaParticlePtr particle;
627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* Attribute wildcard. */
628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeWildcard(xmlSchemaTypeAnyTypeDef->attributeWildcard);
629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* Content type. */
630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	particle = (xmlSchemaParticlePtr) xmlSchemaTypeAnyTypeDef->subtypes;
631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* Wildcard. */
63294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	xmlSchemaFreeWildcard((xmlSchemaWildcardPtr)
633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    particle->children->children->children);
634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree((xmlSchemaParticlePtr) particle->children->children);
635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* Sequence model group. */
636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree((xmlSchemaModelGroupPtr) particle->children);
637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree((xmlSchemaParticlePtr) particle);
63894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	xmlSchemaTypeAnyTypeDef->subtypes = NULL;
639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlHashFree(xmlSchemaTypesBank, (xmlHashDeallocator) xmlSchemaFreeType);
641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypesInitialized = 0;
642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIsBuiltInTypeFacet:
646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the built-in type
647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @facetType:  the facet type
648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluates if a specific facet can be
650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * used in conjunction with a type.
651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the facet can be used with the given built-in type,
653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 0 otherwise and -1 in case the type is not a built-in type.
654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIsBuiltInTypeFacet(xmlSchemaTypePtr type, int facetType)
657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type == NULL)
659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->type != XML_SCHEMA_TYPE_BASIC)
661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (type->builtInType) {
663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_BOOLEAN:
664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((facetType == XML_SCHEMA_FACET_PATTERN) ||
665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(facetType == XML_SCHEMA_FACET_WHITESPACE))
666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (1);
667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
66894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		return (0);
669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_STRING:
670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_NOTATION:
671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_QNAME:
67294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	case XML_SCHEMAS_ANYURI:
67394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	case XML_SCHEMAS_BASE64BINARY:
674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_HEXBINARY:
675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((facetType == XML_SCHEMA_FACET_LENGTH) ||
676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(facetType == XML_SCHEMA_FACET_MINLENGTH) ||
677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(facetType == XML_SCHEMA_FACET_MAXLENGTH) ||
678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(facetType == XML_SCHEMA_FACET_PATTERN) ||
679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(facetType == XML_SCHEMA_FACET_ENUMERATION) ||
680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(facetType == XML_SCHEMA_FACET_WHITESPACE))
681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (1);
682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (0);
684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_DECIMAL:
685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((facetType == XML_SCHEMA_FACET_TOTALDIGITS) ||
686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(facetType == XML_SCHEMA_FACET_FRACTIONDIGITS) ||
687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(facetType == XML_SCHEMA_FACET_PATTERN) ||
688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(facetType == XML_SCHEMA_FACET_WHITESPACE) ||
689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(facetType == XML_SCHEMA_FACET_ENUMERATION) ||
690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) ||
691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) ||
692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(facetType == XML_SCHEMA_FACET_MININCLUSIVE) ||
693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(facetType == XML_SCHEMA_FACET_MINEXCLUSIVE))
694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (1);
695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
69694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		return (0);
697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_TIME:
69894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	case XML_SCHEMAS_GDAY:
699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_GMONTH:
70094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	case XML_SCHEMAS_GMONTHDAY:
70194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	case XML_SCHEMAS_GYEAR:
702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_GYEARMONTH:
703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_DATE:
704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_DATETIME:
705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_DURATION:
706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_FLOAT:
707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_DOUBLE:
708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((facetType == XML_SCHEMA_FACET_PATTERN) ||
709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(facetType == XML_SCHEMA_FACET_ENUMERATION) ||
710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(facetType == XML_SCHEMA_FACET_WHITESPACE) ||
711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) ||
712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) ||
713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(facetType == XML_SCHEMA_FACET_MININCLUSIVE) ||
714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(facetType == XML_SCHEMA_FACET_MINEXCLUSIVE))
715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (1);
716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
71794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		return (0);
718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetBuiltInType:
726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the type of the built in type
727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Gives you the type struct for a built-in
729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * type by its type id.
730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the type if found, NULL otherwise.
732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaTypePtr
734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetBuiltInType(xmlSchemaValType type)
735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaTypesInitialized == 0)
737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaInitTypes();
738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (type) {
73994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_ANYSIMPLETYPE:
741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeAnySimpleTypeDef);
742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_STRING:
743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeStringDef);
744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_NORMSTRING:
745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeNormStringDef);
746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_DECIMAL:
747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeDecimalDef);
748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_TIME:
749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeTimeDef);
750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_GDAY:
751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeGDayDef);
752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_GMONTH:
753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeGMonthDef);
754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_GMONTHDAY:
75594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    return (xmlSchemaTypeGMonthDayDef);
756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_GYEAR:
757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeGYearDef);
758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_GYEARMONTH:
759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeGYearMonthDef);
760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_DATE:
761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeDateDef);
762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_DATETIME:
763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeDatetimeDef);
764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_DURATION:
765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeDurationDef);
766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_FLOAT:
767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeFloatDef);
768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_DOUBLE:
769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeDoubleDef);
770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_BOOLEAN:
771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeBooleanDef);
772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_TOKEN:
773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeTokenDef);
774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_LANGUAGE:
775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeLanguageDef);
776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_NMTOKEN:
777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeNmtokenDef);
778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_NMTOKENS:
779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeNmtokensDef);
780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_NAME:
781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeNameDef);
782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_QNAME:
783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeQNameDef);
784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_NCNAME:
785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeNCNameDef);
786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_ID:
787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeIdDef);
788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_IDREF:
789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeIdrefDef);
790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_IDREFS:
791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeIdrefsDef);
792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_ENTITY:
793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeEntityDef);
794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_ENTITIES:
795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeEntitiesDef);
796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_NOTATION:
797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeNotationDef);
798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_ANYURI:
799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeAnyURIDef);
800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_INTEGER:
801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeIntegerDef);
802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_NPINTEGER:
803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeNonPositiveIntegerDef);
804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_NINTEGER:
805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeNegativeIntegerDef);
806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_NNINTEGER:
807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeNonNegativeIntegerDef);
808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_PINTEGER:
809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypePositiveIntegerDef);
810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_INT:
811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeIntDef);
812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_UINT:
813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeUnsignedIntDef);
814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_LONG:
815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeLongDef);
816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_ULONG:
817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeUnsignedLongDef);
818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_SHORT:
819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeShortDef);
820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_USHORT:
821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeUnsignedShortDef);
822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_BYTE:
823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeByteDef);
824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_UBYTE:
825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeUnsignedByteDef);
826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_HEXBINARY:
827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeHexBinaryDef);
828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_BASE64BINARY:
829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeBase64BinaryDef);
830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_ANYTYPE:
83194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    return (xmlSchemaTypeAnyTypeDef);
832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaValueAppend:
839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @prev: the value
840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the value to be appended
841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Appends a next sibling to a list of computed values.
843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if succeeded and -1 on API errors.
845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValueAppend(xmlSchemaValPtr prev, xmlSchemaValPtr cur) {
848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((prev == NULL) || (cur == NULL))
850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    prev->next = cur;
852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaValueGetNext:
857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the value
858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Accessor for the next sibling of a list of computed values.
860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next value or NULL if there was none, or on
862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         API errors.
863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValPtr
865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValueGetNext(xmlSchemaValPtr cur) {
866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL)
868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (cur->next);
870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaValueGetAsString:
874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the value
875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Accessor for the string value of a computed value.
877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the string value or NULL if there was none, or on
879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         API errors.
880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectconst xmlChar *
882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValueGetAsString(xmlSchemaValPtr val)
88394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun{
884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL)
885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (val->type) {
887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_STRING:
888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_NORMSTRING:
889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_ANYSIMPLETYPE:
890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_TOKEN:
891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_LANGUAGE:
892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_NMTOKEN:
893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_NAME:
894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_NCNAME:
895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_ID:
896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_IDREF:
897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_ENTITY:
898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_ANYURI:
899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (BAD_CAST val->value.str);
900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (NULL);
904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaValueGetAsBoolean:
908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the value
909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Accessor for the boolean value of a computed value.
911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if true and 0 if false, or in case of an error. Hmm.
913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValueGetAsBoolean(xmlSchemaValPtr val)
91694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun{
917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((val == NULL) || (val->type != XML_SCHEMAS_BOOLEAN))
918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (val->value.b);
920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaNewStringValue:
924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the value type
925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the value
926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
92794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Allocate a new simple type value. The type can be
92894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * of XML_SCHEMAS_STRING.
929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * WARNING: This one is intended to be expanded for other
930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string based types. We need this for anySimpleType as well.
931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The given value is consumed and freed with the struct.
932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a pointer to the new value or NULL in case of error
934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValPtr
936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaNewStringValue(xmlSchemaValType type,
937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			const xmlChar *value)
938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValPtr val;
940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type != XML_SCHEMAS_STRING)
942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    val = (xmlSchemaValPtr) xmlMalloc(sizeof(xmlSchemaVal));
944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL) {
945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(val, 0, sizeof(xmlSchemaVal));
948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    val->type = type;
949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    val->value.str = (xmlChar *) value;
950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(val);
951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaNewNOTATIONValue:
955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the notation name
956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns: the notation namespace name or NULL
957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new NOTATION value.
959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The given values are consumed and freed with the struct.
960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a pointer to the new value or NULL in case of error
962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValPtr
964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaNewNOTATIONValue(const xmlChar *name,
965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  const xmlChar *ns)
966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValPtr val;
968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    val = xmlSchemaNewValue(XML_SCHEMAS_NOTATION);
970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL)
971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    val->value.qname.name = (xmlChar *)name;
974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ns != NULL)
975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	val->value.qname.uri = (xmlChar *)ns;
976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(val);
977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaNewQNameValue:
981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @namespaceName: the namespace name
982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @localName: the local name
983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new QName value.
985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The given values are consumed and freed with the struct.
986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a pointer to the new value or NULL in case of an error.
988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValPtr
990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaNewQNameValue(const xmlChar *namespaceName,
991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       const xmlChar *localName)
992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValPtr val;
994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    val = xmlSchemaNewValue(XML_SCHEMAS_QNAME);
996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL)
997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    val->value.qname.name = (xmlChar *) localName;
1000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    val->value.qname.uri = (xmlChar *) namespaceName;
1001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(val);
1002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFreeValue:
1006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the value to free
1007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup the default XML Schemas type library
1009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
101094442ad4107000e6d49f9b85a46a591495a57632Selim Gurunvoid
1011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeValue(xmlSchemaValPtr value) {
1012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValPtr prev;
1013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
101494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    while (value != NULL) {
1015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (value->type) {
1016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_STRING:
1017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_NORMSTRING:
1018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_TOKEN:
1019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_LANGUAGE:
1020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_NMTOKEN:
1021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_NMTOKENS:
1022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_NAME:
1023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_NCNAME:
1024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_ID:
1025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_IDREF:
1026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_IDREFS:
1027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_ENTITY:
102894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    case XML_SCHEMAS_ENTITIES:
1029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_ANYURI:
1030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_ANYSIMPLETYPE:
1031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (value->value.str != NULL)
1032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(value->value.str);
1033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
1034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_NOTATION:
1035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_QNAME:
1036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (value->value.qname.uri != NULL)
1037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(value->value.qname.uri);
1038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (value->value.qname.name != NULL)
1039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(value->value.qname.name);
1040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
1041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_HEXBINARY:
1042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (value->value.hex.str != NULL)
1043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(value->value.hex.str);
1044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
1045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_BASE64BINARY:
1046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (value->value.base64.str != NULL)
1047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(value->value.base64.str);
1048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
1049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
1050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
1051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	prev = value;
1053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	value = value->next;
1054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(prev);
105594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    }
1056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetPredefinedType:
1060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the type name
1061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns:  the URI of the namespace usually "http://www.w3.org/2001/XMLSchema"
1062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Lookup a type in the default XML Schemas type library
1064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the type if found, NULL otherwise
1066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaTypePtr
1068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetPredefinedType(const xmlChar *name, const xmlChar *ns) {
1069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaTypesInitialized == 0)
1070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaInitTypes();
1071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (name == NULL)
1072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
1073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return((xmlSchemaTypePtr) xmlHashLookup2(xmlSchemaTypesBank, name, ns));
1074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetBuiltInListSimpleTypeItemType:
1078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the built-in simple type.
1079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Lookup function
1081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the item type of @type as defined by the built-in datatype
1083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * hierarchy of XML Schema Part 2: Datatypes, or NULL in case of an error.
1084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaTypePtr
1086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetBuiltInListSimpleTypeItemType(xmlSchemaTypePtr type)
1087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((type == NULL) || (type->type != XML_SCHEMA_TYPE_BASIC))
1089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
1090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (type->builtInType) {
109194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	case XML_SCHEMAS_NMTOKENS:
1092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeNmtokenDef );
109394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	case XML_SCHEMAS_IDREFS:
1094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeIdrefDef);
1095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_ENTITIES:
1096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaTypeEntityDef);
1097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
1098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
1099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/****************************************************************
1103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *								*
1104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		Convenience macros and functions		*
1105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *								*
1106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ****************************************************************/
1107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_TZO_CHAR(c)						\
1109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((c == 0) || (c == 'Z') || (c == '+') || (c == '-'))
1110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define VALID_YEAR(yr)          (yr != 0)
1112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define VALID_MONTH(mon)        ((mon >= 1) && (mon <= 12))
1113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* VALID_DAY should only be used when month is unknown */
1114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define VALID_DAY(day)          ((day >= 1) && (day <= 31))
1115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define VALID_HOUR(hr)          ((hr >= 0) && (hr <= 23))
1116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define VALID_MIN(min)          ((min >= 0) && (min <= 59))
1117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define VALID_SEC(sec)          ((sec >= 0) && (sec < 60))
1118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define VALID_TZO(tzo)          ((tzo > -840) && (tzo < 840))
1119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_LEAP(y)						\
1120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
1121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const unsigned int daysInMonth[12] =
1123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
1124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const unsigned int daysInMonthLeap[12] =
1125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
1126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define MAX_DAYINMONTH(yr,mon)                                  \
1128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (IS_LEAP(yr) ? daysInMonthLeap[mon - 1] : daysInMonth[mon - 1])
1129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define VALID_MDAY(dt)						\
1131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(IS_LEAP(dt->year) ?				        \
1132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (dt->day <= daysInMonthLeap[dt->mon - 1]) :	        \
1133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (dt->day <= daysInMonth[dt->mon - 1]))
1134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define VALID_DATE(dt)						\
1136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(VALID_YEAR(dt->year) && VALID_MONTH(dt->mon) && VALID_MDAY(dt))
1137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define VALID_TIME(dt)						\
1139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(VALID_HOUR(dt->hour) && VALID_MIN(dt->min) &&		\
1140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 VALID_SEC(dt->sec) && VALID_TZO(dt->tzo))
1141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define VALID_DATETIME(dt)					\
1143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(VALID_DATE(dt) && VALID_TIME(dt))
1144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define SECS_PER_MIN            (60)
1146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define SECS_PER_HOUR           (60 * SECS_PER_MIN)
1147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define SECS_PER_DAY            (24 * SECS_PER_HOUR)
1148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const long dayInYearByMonth[12] =
1150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
1151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const long dayInLeapYearByMonth[12] =
1152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 };
1153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DAY_IN_YEAR(day, month, year)				\
1155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ((IS_LEAP(year) ?					\
1156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                dayInLeapYearByMonth[month - 1] :		\
1157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                dayInYearByMonth[month - 1]) + day)
1158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG
1160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_DATE(dt)                                                  \
1161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,                             \
1162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        "type=%o %04ld-%02u-%02uT%02u:%02u:%03f",                       \
1163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        dt->type,dt->value.date.year,dt->value.date.mon,                \
1164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        dt->value.date.day,dt->value.date.hour,dt->value.date.min,      \
1165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        dt->value.date.sec);                                            \
1166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (dt->value.date.tz_flag)                                         \
1167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (dt->value.date.tzo != 0)                                    \
1168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext,                     \
1169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                "%+05d\n",dt->value.date.tzo);                          \
1170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else                                                            \
1171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext, "Z\n");             \
1172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else                                                                \
1173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,"\n")
1174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
1175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_DATE(dt)
1176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * _xmlSchemaParseGYear:
1180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dt:  pointer to a date structure
1181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str: pointer to the string to analyze
1182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parses a xs:gYear without time zone and fills in the appropriate
1184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * field of the @dt structure. @str is updated to point just after the
1185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xs:gYear. It is supposed that @dt->year is big enough to contain
1186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the year.
1187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or the error code
1189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project_xmlSchemaParseGYear (xmlSchemaValDatePtr dt, const xmlChar **str) {
1192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *cur = *str, *firstChar;
1193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int isneg = 0, digcnt = 0;
1194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (((*cur < '0') || (*cur > '9')) &&
1196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(*cur != '-') && (*cur != '+'))
1197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return -1;
1198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*cur == '-') {
1200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	isneg = 1;
1201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur++;
1202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    firstChar = cur;
1205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((*cur >= '0') && (*cur <= '9')) {
1207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	dt->year = dt->year * 10 + (*cur - '0');
1208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur++;
1209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	digcnt++;
1210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* year must be at least 4 digits (CCYY); over 4
1213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * digits cannot have a leading zero. */
1214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((digcnt < 4) || ((digcnt > 4) && (*firstChar == '0')))
1215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return 1;
1216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (isneg)
1218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	dt->year = - dt->year;
1219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!VALID_YEAR(dt->year))
1221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return 2;
1222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *str = cur;
1224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return 0;
1225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * PARSE_2_DIGITS:
1229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @num:  the integer to fill in
1230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  an #xmlChar *
1231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @invalid: an integer
1232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parses a 2-digits integer and updates @num with the value. @cur is
1234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * updated to point just after the integer.
1235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * In case of error, @invalid is set to %TRUE, values of @num and
1236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur are undefined.
1237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define PARSE_2_DIGITS(num, cur, invalid)			\
1239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((cur[0] < '0') || (cur[0] > '9') ||			\
1240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cur[1] < '0') || (cur[1] > '9'))			\
1241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    invalid = 1;					\
1242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else							\
1243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    num = (cur[0] - '0') * 10 + (cur[1] - '0');		\
1244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur += 2;
1245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * PARSE_FLOAT:
1248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @num:  the double to fill in
1249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  an #xmlChar *
1250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @invalid: an integer
1251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parses a float and updates @num with the value. @cur is
1253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * updated to point just after the float. The float must have a
1254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2-digits integer part and may or may not have a decimal part.
1255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * In case of error, @invalid is set to %TRUE, values of @num and
1256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur are undefined.
1257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define PARSE_FLOAT(num, cur, invalid)				\
1259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PARSE_2_DIGITS(num, cur, invalid);			\
1260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (!invalid && (*cur == '.')) {			\
1261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    double mult = 1;				        \
1262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur++;						\
1263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((*cur < '0') || (*cur > '9'))			\
1264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		invalid = 1;					\
1265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while ((*cur >= '0') && (*cur <= '9')) {		\
1266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		mult /= 10;					\
1267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		num += (*cur - '0') * mult;			\
1268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur++;						\
1269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }							\
1270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * _xmlSchemaParseGMonth:
1274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dt:  pointer to a date structure
1275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str: pointer to the string to analyze
1276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parses a xs:gMonth without time zone and fills in the appropriate
1278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * field of the @dt structure. @str is updated to point just after the
1279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xs:gMonth.
1280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or the error code
1282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project_xmlSchemaParseGMonth (xmlSchemaValDatePtr dt, const xmlChar **str) {
1285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *cur = *str;
1286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
1287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned int value = 0;
1288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    PARSE_2_DIGITS(value, cur, ret);
1290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0)
1291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return ret;
1292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!VALID_MONTH(value))
1294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return 2;
1295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    dt->mon = value;
1297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *str = cur;
1299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return 0;
1300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * _xmlSchemaParseGDay:
1304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dt:  pointer to a date structure
1305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str: pointer to the string to analyze
1306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parses a xs:gDay without time zone and fills in the appropriate
1308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * field of the @dt structure. @str is updated to point just after the
1309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xs:gDay.
1310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or the error code
1312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project_xmlSchemaParseGDay (xmlSchemaValDatePtr dt, const xmlChar **str) {
1315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *cur = *str;
1316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
1317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned int value = 0;
1318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    PARSE_2_DIGITS(value, cur, ret);
1320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0)
1321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return ret;
1322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!VALID_DAY(value))
1324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return 2;
1325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    dt->day = value;
1327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *str = cur;
1328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return 0;
1329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * _xmlSchemaParseTime:
1333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dt:  pointer to a date structure
1334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str: pointer to the string to analyze
1335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parses a xs:time without time zone and fills in the appropriate
1337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * fields of the @dt structure. @str is updated to point just after the
1338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xs:time.
1339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * In case of error, values of @dt fields are undefined.
1340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or the error code
1342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project_xmlSchemaParseTime (xmlSchemaValDatePtr dt, const xmlChar **str) {
134594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    const xmlChar *cur = *str;
1346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
1347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int value = 0;
1348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    PARSE_2_DIGITS(value, cur, ret);
1350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0)
135194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	return ret;
1352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*cur != ':')
1353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return 1;
1354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!VALID_HOUR(value))
1355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return 2;
1356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur++;
1357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* the ':' insures this string is xs:time */
1359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    dt->hour = value;
1360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    PARSE_2_DIGITS(value, cur, ret);
1362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0)
1363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return ret;
1364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!VALID_MIN(value))
1365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return 2;
1366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    dt->min = value;
1367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*cur != ':')
1369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return 1;
1370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur++;
1371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    PARSE_FLOAT(dt->sec, cur, ret);
1373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0)
1374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return ret;
1375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((!VALID_SEC(dt->sec)) || (!VALID_TZO(dt->tzo)))
1377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return 2;
1378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *str = cur;
1380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return 0;
1381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * _xmlSchemaParseTimeZone:
1385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dt:  pointer to a date structure
1386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str: pointer to the string to analyze
1387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parses a time zone without time zone and fills in the appropriate
1389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * field of the @dt structure. @str is updated to point just after the
1390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * time zone.
1391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or the error code
1393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project_xmlSchemaParseTimeZone (xmlSchemaValDatePtr dt, const xmlChar **str) {
1396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *cur;
1397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
1398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (str == NULL)
1400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return -1;
1401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = *str;
1402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (*cur) {
1404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case 0:
1405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	dt->tz_flag = 0;
1406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	dt->tzo = 0;
1407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
1408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case 'Z':
1410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	dt->tz_flag = 1;
1411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	dt->tzo = 0;
1412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur++;
1413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
1414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case '+':
1416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case '-': {
1417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int isneg = 0, tmp = 0;
1418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	isneg = (*cur == '-');
1419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur++;
1421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PARSE_2_DIGITS(tmp, cur, ret);
1423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret != 0)
1424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return ret;
1425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (!VALID_HOUR(tmp))
1426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return 2;
1427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (*cur != ':')
1429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return 1;
1430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur++;
1431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	dt->tzo = tmp * 60;
1433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PARSE_2_DIGITS(tmp, cur, ret);
1435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret != 0)
1436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return ret;
1437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (!VALID_MIN(tmp))
1438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return 2;
1439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	dt->tzo += tmp;
1441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (isneg)
1442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    dt->tzo = - dt->tzo;
1443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (!VALID_TZO(dt->tzo))
1445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return 2;
1446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	dt->tz_flag = 1;
1448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
1449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      }
1450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    default:
1451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return 1;
1452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *str = cur;
1455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return 0;
1456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * _xmlSchemaBase64Decode:
1460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ch: a character
1461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a base64 encoded character to its base 64 value.
1463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0-63 (value), 64 (pad), or -1 (not recognized)
1465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project_xmlSchemaBase64Decode (const xmlChar ch) {
1468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (('A' <= ch) && (ch <= 'Z')) return ch - 'A';
1469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (('a' <= ch) && (ch <= 'z')) return ch - 'a' + 26;
1470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (('0' <= ch) && (ch <= '9')) return ch - '0' + 52;
1471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ('+' == ch) return 62;
1472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ('/' == ch) return 63;
1473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ('=' == ch) return 64;
1474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return -1;
1475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/****************************************************************
1478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *								*
1479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *	XML Schema Dates/Times Datatypes Handling		*
1480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *								*
1481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ****************************************************************/
1482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * PARSE_DIGITS:
1485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @num:  the integer to fill in
1486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  an #xmlChar *
1487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @num_type: an integer flag
1488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parses a digits integer and updates @num with the value. @cur is
1490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * updated to point just after the integer.
1491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * In case of error, @num_type is set to -1, values of @num and
1492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur are undefined.
1493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define PARSE_DIGITS(num, cur, num_type)	                \
1495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((*cur < '0') || (*cur > '9'))			\
1496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    num_type = -1;					\
1497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else                                                    \
1498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while ((*cur >= '0') && (*cur <= '9')) {		\
1499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        num = num * 10 + (*cur - '0');		        \
1500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        cur++;                                          \
1501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
1502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * PARSE_NUM:
1505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @num:  the double to fill in
1506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  an #xmlChar *
1507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @num_type: an integer flag
1508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parses a float or integer and updates @num with the value. @cur is
1510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * updated to point just after the number. If the number is a float,
1511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then it must have an integer part and a decimal part; @num_type will
1512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * be set to 1. If there is no decimal part, @num_type is set to zero.
1513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * In case of error, @num_type is set to -1, values of @num and
1514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur are undefined.
1515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define PARSE_NUM(num, cur, num_type)				\
1517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        num = 0;                                                \
1518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PARSE_DIGITS(num, cur, num_type);	                \
1519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (!num_type && (*cur == '.')) {			\
1520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    double mult = 1;				        \
1521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur++;						\
1522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((*cur < '0') || (*cur > '9'))			\
1523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		num_type = -1;					\
1524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else                                                \
1525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                num_type = 1;                                   \
1526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while ((*cur >= '0') && (*cur <= '9')) {		\
1527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		mult /= 10;					\
1528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		num += (*cur - '0') * mult;			\
1529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur++;						\
1530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }							\
1531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaValidateDates:
1535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the expected type or XML_SCHEMAS_UNKNOWN
1536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dateTime:  string to analyze
1537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the return computed value
1538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check that @dateTime conforms to the lexical space of one of the date types.
1540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if true a value is computed and returned in @val.
1541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if this validates, a positive error code number otherwise
1543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         and -1 in case of internal or API error.
1544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidateDates (xmlSchemaValType type,
1547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                const xmlChar *dateTime, xmlSchemaValPtr *val,
1548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			int collapse) {
1549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValPtr dt;
1550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
1551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *cur = dateTime;
1552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define RETURN_TYPE_IF_VALID(t)					\
1554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_TZO_CHAR(*cur)) {					\
1555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur);	\
1556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret == 0) {						\
1557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (*cur != 0)					\
1558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto error;					\
1559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    dt->type = t;					\
1560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto done;						\
1561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}							\
1562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (dateTime == NULL)
1565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return -1;
1566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (collapse)
1568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while IS_WSP_BLANK_CH(*cur) cur++;
1569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((*cur != '-') && (*cur < '0') && (*cur > '9'))
1571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return 1;
1572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    dt = xmlSchemaNewValue(XML_SCHEMAS_UNKNOWN);
1574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (dt == NULL)
1575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return -1;
1576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur[0] == '-') && (cur[1] == '-')) {
1578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
1579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * It's an incomplete date (xs:gMonthDay, xs:gMonth or
1580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * xs:gDay)
1581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
1582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur += 2;
1583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* is it an xs:gDay? */
1585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (*cur == '-') {
1586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type == XML_SCHEMAS_GMONTH)
1587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto error;
1588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	  ++cur;
1589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = _xmlSchemaParseGDay(&(dt->value.date), &cur);
1590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret != 0)
1591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto error;
1592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    RETURN_TYPE_IF_VALID(XML_SCHEMAS_GDAY);
1594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto error;
1596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
1599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * it should be an xs:gMonthDay or xs:gMonth
1600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
1601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur);
1602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret != 0)
1603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto error;
1604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /*
1606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         * a '-' char could indicate this type is xs:gMonthDay or
1607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         * a negative time zone offset. Check for xs:gMonthDay first.
1608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         * Also the first three char's of a negative tzo (-MM:SS) can
1609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         * appear to be a valid day; so even if the day portion
1610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         * of the xs:gMonthDay verifies, we must insure it was not
1611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         * a tzo.
1612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         */
1613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (*cur == '-') {
1614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            const xmlChar *rewnd = cur;
1615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur++;
1616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
161794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    ret = _xmlSchemaParseGDay(&(dt->value.date), &cur);
1618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((ret == 0) && ((*cur == 0) || (*cur != ':'))) {
1619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /*
1621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * we can use the VALID_MDAY macro to validate the month
1622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * and day because the leap year test will flag year zero
1623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * as a leap year (even though zero is an invalid year).
1624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * FUTURE TODO: Zero will become valid in XML Schema 1.1
1625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * probably.
1626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 */
1627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (VALID_MDAY((&(dt->value.date)))) {
1628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	            RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTHDAY);
1630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    goto error;
1632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
1633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
1634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
1636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * not xs:gMonthDay so rewind and check if just xs:gMonth
1637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * with an optional time zone.
1638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             */
1639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur = rewnd;
1640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTH);
1643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto error;
1645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * It's a right-truncated date or an xs:time.
1649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Try to parse an xs:time then fallback on right-truncated dates.
1650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((*cur >= '0') && (*cur <= '9')) {
1652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = _xmlSchemaParseTime(&(dt->value.date), &cur);
1653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret == 0) {
1654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* it's an xs:time */
1655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    RETURN_TYPE_IF_VALID(XML_SCHEMAS_TIME);
1656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* fallback on date parsing */
1660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = dateTime;
1661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = _xmlSchemaParseGYear(&(dt->value.date), &cur);
1663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0)
1664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto error;
1665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* is it an xs:gYear? */
1667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEAR);
1668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*cur != '-')
1670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto error;
1671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur++;
1672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur);
1674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0)
1675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto error;
1676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* is it an xs:gYearMonth? */
1678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEARMONTH);
1679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*cur != '-')
1681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto error;
1682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur++;
1683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = _xmlSchemaParseGDay(&(dt->value.date), &cur);
1685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ret != 0) || !VALID_DATE((&(dt->value.date))))
1686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto error;
1687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* is it an xs:date? */
1689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    RETURN_TYPE_IF_VALID(XML_SCHEMAS_DATE);
1690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*cur != 'T')
1692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto error;
1693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur++;
1694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* it should be an xs:dateTime */
1696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = _xmlSchemaParseTime(&(dt->value.date), &cur);
1697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0)
1698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto error;
1699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur);
1701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (collapse)
1702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while IS_WSP_BLANK_CH(*cur) cur++;
1703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ret != 0) || (*cur != 0) || (!(VALID_DATETIME((&(dt->value.date))))))
1704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto error;
1705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    dt->type = XML_SCHEMAS_DATETIME;
1708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdone:
1710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 1
1711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type))
1712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        goto error;
1713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
1714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * insure the parsed type is equal to or less significant (right
1716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * truncated) than the desired type.
1717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type)) {
1719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /* time only matches time */
1721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((type == XML_SCHEMAS_TIME) && (dt->type == XML_SCHEMAS_TIME))
1722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            goto error;
1723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((type == XML_SCHEMAS_DATETIME) &&
1725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ((dt->type != XML_SCHEMAS_DATE) ||
1726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             (dt->type != XML_SCHEMAS_GYEARMONTH) ||
1727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             (dt->type != XML_SCHEMAS_GYEAR)))
1728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            goto error;
1729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((type == XML_SCHEMAS_DATE) &&
1731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ((dt->type != XML_SCHEMAS_GYEAR) ||
1732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             (dt->type != XML_SCHEMAS_GYEARMONTH)))
1733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            goto error;
1734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((type == XML_SCHEMAS_GYEARMONTH) && (dt->type != XML_SCHEMAS_GYEAR))
1736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            goto error;
1737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((type == XML_SCHEMAS_GMONTHDAY) && (dt->type != XML_SCHEMAS_GMONTH))
1739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            goto error;
1740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val != NULL)
1744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        *val = dt;
1745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
1746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeValue(dt);
1747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return 0;
1749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecterror:
1751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (dt != NULL)
1752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeValue(dt);
1753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return 1;
1754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaValidateDuration:
1758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the predefined type
1759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @duration:  string to analyze
1760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the return computed value
1761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check that @duration conforms to the lexical space of the duration type.
1763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if true a value is computed and returned in @val.
1764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if this validates, a positive error code number otherwise
1766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         and -1 in case of internal or API error.
1767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidateDuration (xmlSchemaTypePtr type ATTRIBUTE_UNUSED,
1770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                   const xmlChar *duration, xmlSchemaValPtr *val,
1771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   int collapse) {
1772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar  *cur = duration;
1773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValPtr dur;
1774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int isneg = 0;
1775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned int seq = 0;
1776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double         num;
1777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int            num_type = 0;  /* -1 = invalid, 0 = int, 1 = floating */
1778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar  desig[]  = {'Y', 'M', 'D', 'H', 'M', 'S'};
1779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const double   multi[]  = { 0.0, 0.0, 86400.0, 3600.0, 60.0, 1.0, 0.0};
1780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (duration == NULL)
1782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return -1;
1783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (collapse)
1785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while IS_WSP_BLANK_CH(*cur) cur++;
1786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*cur == '-') {
1788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        isneg = 1;
1789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur++;
1790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* duration must start with 'P' (after sign) */
1793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*cur++ != 'P')
1794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return 1;
1795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*cur == 0)
1797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return 1;
1798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION);
1800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (dur == NULL)
1801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return -1;
1802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (*cur != 0) {
1804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /* input string should be empty or invalid date/time item */
1806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (seq >= sizeof(desig))
1807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            goto error;
1808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /* T designator must be present for time items */
1810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (*cur == 'T') {
1811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (seq <= 3) {
1812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                seq = 3;
1813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur++;
1814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else
1815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return 1;
1816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (seq == 3)
1817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            goto error;
1818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /* parse the number portion of the item */
1820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        PARSE_NUM(num, cur, num_type);
1821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((num_type == -1) || (*cur == 0))
1823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            goto error;
1824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /* update duration based on item type */
1826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        while (seq < sizeof(desig)) {
1827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (*cur == desig[seq]) {
1828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /* verify numeric type; only seconds can be float */
1830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((num_type != 0) && (seq < (sizeof(desig)-1)))
1831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    goto error;
1832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                switch (seq) {
1834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    case 0:
1835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        dur->value.dur.mon = (long)num * 12;
1836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
1837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    case 1:
1838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        dur->value.dur.mon += (long)num;
1839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
1840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    default:
1841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        /* convert to seconds using multiplier */
1842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        dur->value.dur.sec += num * multi[seq];
1843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        seq++;
1844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
1845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
1846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;          /* exit loop */
1848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
1849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /* no date designators found? */
1850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((++seq == 3) || (seq == 6))
1851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                goto error;
1852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur++;
1854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (collapse)
185594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    while IS_WSP_BLANK_CH(*cur) cur++;
1856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (isneg) {
1859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        dur->value.dur.mon = -dur->value.dur.mon;
1860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        dur->value.dur.day = -dur->value.dur.day;
1861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        dur->value.dur.sec = -dur->value.dur.sec;
1862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val != NULL)
1865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        *val = dur;
1866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
1867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeValue(dur);
1868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return 0;
1870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecterror:
1872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (dur != NULL)
1873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeValue(dur);
1874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return 1;
1875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaStrip:
1879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: a value
1880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Removes the leading and ending spaces of a string
1882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new string or NULL if no change was required.
1884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar *
1886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaStrip(const xmlChar *value) {
1887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *start = value, *end, *f;
1888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (value == NULL) return(NULL);
1890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((*start != 0) && (IS_BLANK_CH(*start))) start++;
1891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    end = start;
1892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (*end != 0) end++;
1893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    f = end;
1894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    end--;
1895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((end > start) && (IS_BLANK_CH(*end))) end--;
1896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    end++;
1897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((start == value) && (f == end)) return(NULL);
1898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlStrndup(start, end - start));
1899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaWhiteSpaceReplace:
1903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: a value
1904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Replaces 0xd, 0x9 and 0xa with a space.
1906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new string or NULL if no change was required.
1908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar *
1910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaWhiteSpaceReplace(const xmlChar *value) {
191194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    const xmlChar *cur = value;
191294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    xmlChar *ret = NULL, *mcur;
1913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
191494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    if (value == NULL)
1915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
191694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
191794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    while ((*cur != 0) &&
1918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(((*cur) != 0xd) && ((*cur) != 0x9) && ((*cur) != 0xa))) {
1919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur++;
1920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*cur == 0)
1922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
1923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlStrdup(value);
1924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO FIXME: I guess gcc will bark at this. */
1925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    mcur = (xmlChar *)  (ret + (cur - value));
1926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
1927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ( ((*mcur) == 0xd) || ((*mcur) == 0x9) || ((*mcur) == 0xa) )
1928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *mcur = ' ';
1929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	mcur++;
193094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    } while (*mcur != 0);
1931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
1932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCollapseString:
1936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: a value
1937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Removes and normalize white spaces in the string
1939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new string or NULL if no change was required.
1941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar *
1943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCollapseString(const xmlChar *value) {
1944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *start = value, *end, *f;
1945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *g;
1946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int col = 0;
1947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (value == NULL) return(NULL);
1949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((*start != 0) && (IS_BLANK_CH(*start))) start++;
1950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    end = start;
1951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (*end != 0) {
1952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((*end == ' ') && (IS_BLANK_CH(end[1]))) {
1953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    col = end - start;
1954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((*end == 0xa) || (*end == 0x9) || (*end == 0xd)) {
1956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    col = end - start;
1957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	end++;
1960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (col == 0) {
1962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	f = end;
1963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	end--;
1964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while ((end > start) && (IS_BLANK_CH(*end))) end--;
1965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	end++;
1966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((start == value) && (f == end)) return(NULL);
1967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlStrndup(start, end - start));
1968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    start = xmlStrdup(start);
1970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (start == NULL) return(NULL);
1971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    g = (xmlChar *) (start + col);
1972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    end = g;
1973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (*end != 0) {
1974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (IS_BLANK_CH(*end)) {
1975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    end++;
1976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (IS_BLANK_CH(*end)) end++;
1977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (*end != 0)
1978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*g++ = ' ';
1979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
1980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *g++ = *end++;
1981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *g = 0;
1983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return((xmlChar *) start);
1984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaValAtomicListNode:
1988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the predefined atomic type for a token in the list
1989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the list value to check
1990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ret:  the return computed value
1991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the node containing the value
1992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check that a value conforms to the lexical space of the predefined
1994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * list type. if true a value is computed and returned in @ret.
1995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of items if this validates, a negative error code
1997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         number otherwise
1998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValAtomicListNode(xmlSchemaTypePtr type, const xmlChar *value,
2001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                   xmlSchemaValPtr *ret, xmlNodePtr node) {
2002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *val, *cur, *endval;
2003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nb_values = 0;
2004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int tmp = 0;
2005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (value == NULL) {
2007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
2008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    val = xmlStrdup(value);
2010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL) {
2011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
2012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != NULL) {
2014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        *ret = NULL;
2015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = val;
2017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Split the list
2019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
2020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (IS_BLANK_CH(*cur)) *cur++ = 0;
2021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (*cur != 0) {
2022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (IS_BLANK_CH(*cur)) {
2023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *cur = 0;
2024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur++;
2025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (IS_BLANK_CH(*cur)) *cur++ = 0;
2026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
2027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nb_values++;
2028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur++;
2029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while ((*cur != 0) && (!IS_BLANK_CH(*cur))) cur++;
2030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nb_values == 0) {
2033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(val);
2034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(nb_values);
2035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    endval = cur;
2037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = val;
2038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((*cur == 0) && (cur != endval)) cur++;
2039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != endval) {
2040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp = xmlSchemaValPredefTypeNode(type, cur, NULL, node);
2041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (tmp != 0)
2042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (*cur != 0) cur++;
2044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while ((*cur == 0) && (cur != endval)) cur++;
2045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO what return value ? c.f. bug #158628
2047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != NULL) {
2048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	TODO
2049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } */
2050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(val);
2051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (tmp == 0)
2052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(nb_values);
2053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(-1);
2054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseUInt:
2058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str: pointer to the string R/W
2059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @llo: pointer to the low result
2060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @lmi: pointer to the mid result
2061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @lhi: pointer to the high result
2062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse an unsigned long into 3 fields.
2064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of significant digits in the number or
206660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * -1 if overflow of the capacity and -2 if it's not a number.
2067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseUInt(const xmlChar **str, unsigned long *llo,
2070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   unsigned long *lmi, unsigned long *lhi) {
2071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned long lo = 0, mi = 0, hi = 0;
2072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *tmp, *cur = *str;
2073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0, i = 0;
2074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
207594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    if (!((*cur >= '0') && (*cur <= '9')))
207660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        return(-2);
207760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (*cur == '0') {        /* ignore leading zeroes */
2079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur++;
2080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    tmp = cur;
2082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((*tmp != 0) && (*tmp >= '0') && (*tmp <= '9')) {
2083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        i++;tmp++;ret++;
2084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (i > 24) {
2086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        *str = tmp;
2087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
2088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (i > 16) {
2090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        hi = hi * 10 + (*cur++ - '0');
2091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        i--;
2092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (i > 8) {
2094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        mi = mi * 10 + (*cur++ - '0');
2095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        i--;
2096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (i > 0) {
2098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        lo = lo * 10 + (*cur++ - '0');
2099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        i--;
2100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *str = cur;
2103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *llo = lo;
2104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *lmi = mi;
2105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *lhi = hi;
2106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
2107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaValAtomicType:
2111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the predefined type
2112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the value to check
2113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the return computed value
2114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the node containing the value
2115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * flags:  flags to control the vlidation
2116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check that a value conforms to the lexical space of the atomic type.
2118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if true a value is computed and returned in @val.
2119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This checks the value space for list types as well (IDREFS, NMTOKENS).
2120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if this validates, a positive error code number otherwise
2122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         and -1 in case of internal or API error.
2123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value,
2126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       xmlSchemaValPtr * val, xmlNodePtr node, int flags,
2127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlSchemaWhitespaceValueType ws,
2128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       int normOnTheFly, int applyNorm, int createStringValue)
2129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValPtr v;
2131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *norm = NULL;
2132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
2133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaTypesInitialized == 0)
2135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaInitTypes();
2136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type == NULL)
2137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * validating a non existant text node is similar to validating
2141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * an empty one.
2142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
2143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (value == NULL)
2144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        value = BAD_CAST "";
2145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val != NULL)
2147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        *val = NULL;
2148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((flags == 0) && (value != NULL)) {
2149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((type->builtInType != XML_SCHEMAS_STRING) &&
215194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	  (type->builtInType != XML_SCHEMAS_ANYTYPE) &&
2152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	  (type->builtInType != XML_SCHEMAS_ANYSIMPLETYPE)) {
2153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type->builtInType == XML_SCHEMAS_NORMSTRING)
2154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		norm = xmlSchemaWhiteSpaceReplace(value);
2155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else
2156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		norm = xmlSchemaCollapseString(value);
2157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (norm != NULL)
2158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                value = norm;
2159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
2160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (type->builtInType) {
216394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun        case XML_SCHEMAS_UNKNOWN:
2164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            goto error;
2165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_ANYTYPE:
2166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_ANYSIMPLETYPE:
2167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((createStringValue) && (val != NULL)) {
2168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		v = xmlSchemaNewValue(XML_SCHEMAS_ANYSIMPLETYPE);
2169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (v != NULL) {
2170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    v->value.str = xmlStrdup(value);
2171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *val = v;
2172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
2173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto error;
217494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		}
2175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto return0;
217794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun        case XML_SCHEMAS_STRING:
2178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (! normOnTheFly) {
2179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		const xmlChar *cur = value;
2180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ws == XML_SCHEMA_WHITESPACE_REPLACE) {
2182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    while (*cur != 0) {
2183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) {
2184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    goto return1;
2185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else {
2186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    cur++;
2187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
2188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
2189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) {
2190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    while (*cur != 0) {
2191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) {
2192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    goto return1;
2193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else if IS_WSP_SPACE_CH(*cur) {
2194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    cur++;
2195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if IS_WSP_SPACE_CH(*cur)
2196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				goto return1;
2197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else {
2198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    cur++;
2199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
2200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
2201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (createStringValue && (val != NULL)) {
2204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (applyNorm) {
2205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
2206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			norm = xmlSchemaCollapseString(value);
2207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else if (ws == XML_SCHEMA_WHITESPACE_REPLACE)
2208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			norm = xmlSchemaWhiteSpaceReplace(value);
2209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (norm != NULL)
2210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			value = norm;
2211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		v = xmlSchemaNewValue(XML_SCHEMAS_STRING);
2213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (v != NULL) {
2214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    v->value.str = xmlStrdup(value);
2215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *val = v;
2216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
2217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto error;
2218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            goto return0;
2221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_NORMSTRING:{
2222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (normOnTheFly) {
2223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (applyNorm) {
2224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
2225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    norm = xmlSchemaCollapseString(value);
2226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			else
2227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    norm = xmlSchemaWhiteSpaceReplace(value);
2228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (norm != NULL)
2229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    value = norm;
2230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
2231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
2232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    const xmlChar *cur = value;
2233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    while (*cur != 0) {
2234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) {
2235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    goto return1;
2236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else {
2237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    cur++;
2238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
2239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
2240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (val != NULL) {
2242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    v = xmlSchemaNewValue(XML_SCHEMAS_NORMSTRING);
2243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (v != NULL) {
2244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        v->value.str = xmlStrdup(value);
2245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        *val = v;
2246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else {
2247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto error;
2248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
2249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
2250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                goto return0;
2251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
2252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_DECIMAL:{
2253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                const xmlChar *cur = value;
2254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                unsigned int len, neg, integ, hasLeadingZeroes;
2255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlChar cval[25];
225694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		xmlChar *cptr = cval;
2257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((cur == NULL) || (*cur == 0))
2259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    goto return1;
2260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
2262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* xs:decimal has a whitespace-facet value of 'collapse'.
2263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
2264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (normOnTheFly)
2265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    while IS_WSP_BLANK_CH(*cur) cur++;
2266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
2268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* First we handle an optional sign.
2269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
2270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		neg = 0;
2271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (*cur == '-') {
2272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    neg = 1;
2273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    cur++;
2274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (*cur == '+')
2275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    cur++;
2276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
2277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Disallow: "", "-", "- "
2278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
2279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (*cur == 0)
2280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto return1;
2281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
2282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * Next we "pre-parse" the number, in preparation for calling
2283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * the common routine xmlSchemaParseUInt.  We get rid of any
2284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * leading zeroes (because we have reserved only 25 chars),
2285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * and note the position of a decimal point.
2286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 */
2287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		len = 0;
2288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		integ = ~0u;
2289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		hasLeadingZeroes = 0;
2290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
2291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Skip leading zeroes.
2292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
2293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		while (*cur == '0') {
2294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cur++;
2295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    hasLeadingZeroes = 1;
2296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (*cur != 0) {
2298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    do {
2299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if ((*cur >= '0') && (*cur <= '9')) {
2300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    *cptr++ = *cur++;
2301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    len++;
2302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else if (*cur == '.') {
2303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    cur++;
2304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    integ = len;
2305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    do {
2306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				if ((*cur >= '0') && (*cur <= '9')) {
2307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    *cptr++ = *cur++;
2308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    len++;
2309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				} else
2310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    break;
2311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    } while (len < 24);
2312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /*
2313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * Disallow "." but allow "00."
2314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    */
2315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if ((len == 0) && (!hasLeadingZeroes))
2316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				goto return1;
2317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    break;
2318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else
2319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    break;
2320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } while (len < 24);
2321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (normOnTheFly)
2323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    while IS_WSP_BLANK_CH(*cur) cur++;
2324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (*cur != 0)
2325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto return1; /* error if any extraneous chars */
2326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (val != NULL) {
2327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL);
2328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (v != NULL) {
2329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
233094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun			* Now evaluate the significant digits of the number
233194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun			*/
2332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (len != 0) {
233394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
2334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (integ != ~0u) {
2335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				/*
2336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				* Get rid of trailing zeroes in the
2337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				* fractional part.
2338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				*/
2339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				while ((len != integ) && (*(cptr-1) == '0')) {
2340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    cptr--;
2341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    len--;
2342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				}
2343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
2344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /*
2345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * Terminate the (preparsed) string.
2346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    */
2347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (len != 0) {
234860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott				*cptr = 0;
2349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				cptr = cval;
235060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlSchemaParseUInt((const xmlChar **)&cptr,
2352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    &v->value.decimal.lo,
2353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    &v->value.decimal.mi,
2354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    &v->value.decimal.hi);
2355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
2356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
2357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
2358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* Set the total digits to 1 if a zero value.
2359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
2360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        v->value.decimal.sign = neg;
2361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (len == 0) {
2362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /* Speedup for zero values. */
2363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    v->value.decimal.total = 1;
2364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else {
2365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    v->value.decimal.total = len;
2366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (integ == ~0u)
2367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				v->value.decimal.frac = 0;
2368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    else
2369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				v->value.decimal.frac = len - integ;
2370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
2371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        *val = v;
2372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
2373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
2374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                goto return0;
2375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
2376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_TIME:
2377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_GDAY:
2378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_GMONTH:
2379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_GMONTHDAY:
2380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_GYEAR:
2381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_GYEARMONTH:
2382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_DATE:
2383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_DATETIME:
2384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlSchemaValidateDates(type->builtInType, value, val,
2385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		normOnTheFly);
2386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_DURATION:
2388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlSchemaValidateDuration(type, value, val,
2389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		normOnTheFly);
2390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_FLOAT:
2392df143a5041f03a22808b59c76698770b74692815Selim Gurun        case XML_SCHEMAS_DOUBLE: {
2393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                const xmlChar *cur = value;
2394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                int neg = 0;
2395df143a5041f03a22808b59c76698770b74692815Selim Gurun                int digits_before = 0;
2396df143a5041f03a22808b59c76698770b74692815Selim Gurun                int digits_after = 0;
2397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (normOnTheFly)
2399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    while IS_WSP_BLANK_CH(*cur) cur++;
2400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((cur[0] == 'N') && (cur[1] == 'a') && (cur[2] == 'N')) {
2402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    cur += 3;
2403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (*cur != 0)
2404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto return1;
2405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (val != NULL) {
2406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (type == xmlSchemaTypeFloatDef) {
2407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
2408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (v != NULL) {
2409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                v->value.f = (float) xmlXPathNAN;
2410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            } else {
2411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlSchemaFreeValue(v);
2412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                goto error;
2413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
2414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        } else {
2415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
2416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (v != NULL) {
2417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                v->value.d = xmlXPathNAN;
2418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            } else {
2419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlSchemaFreeValue(v);
2420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                goto error;
2421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
2422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
2423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        *val = v;
2424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
2425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    goto return0;
2426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
2427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (*cur == '-') {
2428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    neg = 1;
2429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    cur++;
2430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
2431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((cur[0] == 'I') && (cur[1] == 'N') && (cur[2] == 'F')) {
2432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    cur += 3;
2433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (*cur != 0)
2434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto return1;
2435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (val != NULL) {
2436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (type == xmlSchemaTypeFloatDef) {
2437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
2438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (v != NULL) {
2439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                if (neg)
2440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    v->value.f = (float) xmlXPathNINF;
2441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                else
2442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    v->value.f = (float) xmlXPathPINF;
2443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            } else {
2444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlSchemaFreeValue(v);
2445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                goto error;
2446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
2447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        } else {
2448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
2449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (v != NULL) {
2450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                if (neg)
2451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    v->value.d = xmlXPathNINF;
2452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                else
2453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    v->value.d = xmlXPathPINF;
2454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            } else {
2455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlSchemaFreeValue(v);
2456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                goto error;
2457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
2458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
2459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        *val = v;
2460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
2461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    goto return0;
2462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
2463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((neg == 0) && (*cur == '+'))
2464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    cur++;
2465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((cur[0] == 0) || (cur[0] == '+') || (cur[0] == '-'))
2466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    goto return1;
2467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while ((*cur >= '0') && (*cur <= '9')) {
2468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    cur++;
2469df143a5041f03a22808b59c76698770b74692815Selim Gurun                    digits_before++;
2470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
2471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (*cur == '.') {
2472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    cur++;
2473df143a5041f03a22808b59c76698770b74692815Selim Gurun                    while ((*cur >= '0') && (*cur <= '9')) {
2474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        cur++;
2475df143a5041f03a22808b59c76698770b74692815Selim Gurun                        digits_after++;
2476df143a5041f03a22808b59c76698770b74692815Selim Gurun                    }
2477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
2478df143a5041f03a22808b59c76698770b74692815Selim Gurun                if ((digits_before == 0) && (digits_after == 0))
2479df143a5041f03a22808b59c76698770b74692815Selim Gurun                    goto return1;
2480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((*cur == 'e') || (*cur == 'E')) {
2481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    cur++;
2482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((*cur == '-') || (*cur == '+'))
2483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        cur++;
2484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    while ((*cur >= '0') && (*cur <= '9'))
2485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        cur++;
2486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
2487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (normOnTheFly)
2488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    while IS_WSP_BLANK_CH(*cur) cur++;
2489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (*cur != 0)
2491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    goto return1;
2492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (val != NULL) {
2493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (type == xmlSchemaTypeFloatDef) {
2494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
2495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (v != NULL) {
2496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /*
2497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * TODO: sscanf seems not to give the correct
2498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * value for extremely high/low values.
2499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * E.g. "1E-149" results in zero.
2500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    */
2501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (sscanf((const char *) value, "%f",
2502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                 &(v->value.f)) == 1) {
2503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                *val = v;
2504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            } else {
2505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlSchemaFreeValue(v);
2506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                goto return1;
2507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
2508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        } else {
2509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            goto error;
2510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
2511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else {
2512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
2513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (v != NULL) {
2514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /*
2515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * TODO: sscanf seems not to give the correct
2516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * value for extremely high/low values.
2517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    */
2518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (sscanf((const char *) value, "%lf",
2519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                 &(v->value.d)) == 1) {
2520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                *val = v;
2521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            } else {
2522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlSchemaFreeValue(v);
2523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                goto return1;
2524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
2525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        } else {
2526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            goto error;
2527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
2528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
2529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
2530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                goto return0;
2531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
2532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_BOOLEAN:{
2533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                const xmlChar *cur = value;
2534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (normOnTheFly) {
2536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    while IS_WSP_BLANK_CH(*cur) cur++;
2537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (*cur == '0') {
2538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = 0;
2539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			cur++;
2540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if (*cur == '1') {
2541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = 1;
2542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			cur++;
2543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if (*cur == 't') {
2544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			cur++;
2545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if ((*cur++ == 'r') && (*cur++ == 'u') &&
2546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    (*cur++ == 'e')) {
2547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = 1;
2548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else
2549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    goto return1;
2550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if (*cur == 'f') {
2551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			cur++;
2552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if ((*cur++ == 'a') && (*cur++ == 'l') &&
2553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    (*cur++ == 's') && (*cur++ == 'e')) {
2554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = 0;
2555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else
2556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    goto return1;
2557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else
2558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto return1;
2559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (*cur != 0) {
2560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			while IS_WSP_BLANK_CH(*cur) cur++;
2561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (*cur != 0)
2562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    goto return1;
2563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
2564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
2565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((cur[0] == '0') && (cur[1] == 0))
2566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = 0;
2567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else if ((cur[0] == '1') && (cur[1] == 0))
2568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = 1;
2569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else if ((cur[0] == 't') && (cur[1] == 'r')
2570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			&& (cur[2] == 'u') && (cur[3] == 'e')
2571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			&& (cur[4] == 0))
2572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = 1;
2573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else if ((cur[0] == 'f') && (cur[1] == 'a')
2574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			&& (cur[2] == 'l') && (cur[3] == 's')
2575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			&& (cur[4] == 'e') && (cur[5] == 0))
2576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = 0;
2577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
2578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto return1;
2579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (val != NULL) {
2581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    v = xmlSchemaNewValue(XML_SCHEMAS_BOOLEAN);
2582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (v != NULL) {
2583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        v->value.b = ret;
2584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        *val = v;
2585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else {
2586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto error;
2587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
2588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
2589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                goto return0;
2590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
2591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_TOKEN:{
2592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                const xmlChar *cur = value;
2593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (! normOnTheFly) {
2595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    while (*cur != 0) {
2596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) {
2597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    goto return1;
2598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else if (*cur == ' ') {
2599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    cur++;
2600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (*cur == 0)
2601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				goto return1;
2602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (*cur == ' ')
2603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				goto return1;
2604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else {
2605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    cur++;
2606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
260794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		    }
260894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		}
2609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (val != NULL) {
2610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    v = xmlSchemaNewValue(XML_SCHEMAS_TOKEN);
2611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (v != NULL) {
2612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        v->value.str = xmlStrdup(value);
2613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        *val = v;
2614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else {
2615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto error;
2616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
2617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
2618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                goto return0;
2619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
2620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_LANGUAGE:
262194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    if (normOnTheFly) {
2622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		norm = xmlSchemaCollapseString(value);
2623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (norm != NULL)
2624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    value = norm;
2625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (xmlCheckLanguageID(value) == 1) {
2627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (val != NULL) {
2628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    v = xmlSchemaNewValue(XML_SCHEMAS_LANGUAGE);
2629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (v != NULL) {
2630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        v->value.str = xmlStrdup(value);
2631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        *val = v;
2632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else {
2633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto error;
2634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
2635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
2636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                goto return0;
2637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
2638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            goto return1;
2639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_NMTOKEN:
2640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (xmlValidateNMToken(value, 1) == 0) {
2641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (val != NULL) {
2642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    v = xmlSchemaNewValue(XML_SCHEMAS_NMTOKEN);
2643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (v != NULL) {
2644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        v->value.str = xmlStrdup(value);
2645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        *val = v;
2646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else {
2647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto error;
2648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
2649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
2650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                goto return0;
2651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
2652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            goto return1;
2653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_NMTOKENS:
2654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlSchemaValAtomicListNode(xmlSchemaTypeNmtokenDef,
2655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                             value, val, node);
2656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret > 0)
2657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = 0;
2658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else
2659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = 1;
2660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            goto done;
2661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_NAME:
2662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlValidateName(value, 1);
2663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((ret == 0) && (val != NULL) && (value != NULL)) {
2664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		v = xmlSchemaNewValue(XML_SCHEMAS_NAME);
2665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (v != NULL) {
2666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const xmlChar *start = value, *end;
2667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     while (IS_BLANK_CH(*start)) start++;
2668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     end = start;
2669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     while ((*end != 0) && (!IS_BLANK_CH(*end))) end++;
2670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     v->value.str = xmlStrndup(start, end - start);
2671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *val = v;
2672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
2673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto error;
2674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
2676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            goto done;
2677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_QNAME:{
2678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                const xmlChar *uri = NULL;
2679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlChar *local = NULL;
2680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = xmlValidateQName(value, 1);
2682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret != 0)
2683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto done;
2684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (node != NULL) {
2685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlChar *prefix;
2686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlNsPtr ns;
2687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    local = xmlSplitQName2(value, &prefix);
2689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ns = xmlSearchNs(node->doc, node, prefix);
2690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((ns == NULL) && (prefix != NULL)) {
2691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlFree(prefix);
2692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (local != NULL)
2693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlFree(local);
2694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto return1;
2695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
2696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ns != NULL)
2697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			uri = ns->href;
2698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (prefix != NULL)
2699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(prefix);
2700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
2701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (val != NULL) {
2702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    v = xmlSchemaNewValue(XML_SCHEMAS_QNAME);
2703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (v == NULL) {
2704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (local != NULL)
2705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlFree(local);
2706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto error;
2707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
2708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (local != NULL)
2709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			v->value.qname.name = local;
2710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
2711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			v->value.qname.name = xmlStrdup(value);
2712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (uri != NULL)
2713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			v->value.qname.uri = xmlStrdup(uri);
2714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *val = v;
2715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else
2716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (local != NULL)
2717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlFree(local);
2718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                goto done;
2719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
2720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_NCNAME:
2721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlValidateNCName(value, 1);
2722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((ret == 0) && (val != NULL)) {
2723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                v = xmlSchemaNewValue(XML_SCHEMAS_NCNAME);
2724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (v != NULL) {
2725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    v->value.str = xmlStrdup(value);
2726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    *val = v;
2727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
2728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    goto error;
2729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
2730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
2731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            goto done;
2732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_ID:
2733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlValidateNCName(value, 1);
2734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((ret == 0) && (val != NULL)) {
2735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                v = xmlSchemaNewValue(XML_SCHEMAS_ID);
2736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (v != NULL) {
2737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    v->value.str = xmlStrdup(value);
2738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    *val = v;
2739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
2740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    goto error;
2741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
2742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
2743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((ret == 0) && (node != NULL) &&
2744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (node->type == XML_ATTRIBUTE_NODE)) {
2745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAttrPtr attr = (xmlAttrPtr) node;
2746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /*
2748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * NOTE: the IDness might have already be declared in the DTD
2749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 */
2750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (attr->atype != XML_ATTRIBUTE_ID) {
2751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlIDPtr res;
2752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlChar *strip;
2753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    strip = xmlSchemaStrip(value);
2755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (strip != NULL) {
2756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        res = xmlAddID(NULL, node->doc, strip, attr);
2757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(strip);
2758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else
2759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        res = xmlAddID(NULL, node->doc, value, attr);
2760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (res == NULL) {
2761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = 2;
2762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else {
2763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        attr->atype = XML_ATTRIBUTE_ID;
2764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
2765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
2766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
2767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            goto done;
2768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_IDREF:
2769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlValidateNCName(value, 1);
2770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((ret == 0) && (val != NULL)) {
2771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		v = xmlSchemaNewValue(XML_SCHEMAS_IDREF);
2772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (v == NULL)
2773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto error;
2774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		v->value.str = xmlStrdup(value);
2775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*val = v;
2776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
2777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((ret == 0) && (node != NULL) &&
2778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (node->type == XML_ATTRIBUTE_NODE)) {
2779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAttrPtr attr = (xmlAttrPtr) node;
2780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlChar *strip;
2781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                strip = xmlSchemaStrip(value);
2783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (strip != NULL) {
2784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlAddRef(NULL, node->doc, strip, attr);
2785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlFree(strip);
2786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else
2787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlAddRef(NULL, node->doc, value, attr);
2788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                attr->atype = XML_ATTRIBUTE_IDREF;
2789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
2790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            goto done;
2791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_IDREFS:
2792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlSchemaValAtomicListNode(xmlSchemaTypeIdrefDef,
2793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                             value, val, node);
2794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret < 0)
2795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = 2;
2796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else
2797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = 0;
2798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((ret == 0) && (node != NULL) &&
2799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (node->type == XML_ATTRIBUTE_NODE)) {
2800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAttrPtr attr = (xmlAttrPtr) node;
2801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                attr->atype = XML_ATTRIBUTE_IDREFS;
2803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
2804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            goto done;
2805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_ENTITY:{
2806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlChar *strip;
2807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = xmlValidateNCName(value, 1);
2809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((node == NULL) || (node->doc == NULL))
2810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = 3;
2811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret == 0) {
2812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlEntityPtr ent;
2813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    strip = xmlSchemaStrip(value);
2815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (strip != NULL) {
2816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ent = xmlGetDocEntity(node->doc, strip);
2817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(strip);
2818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else {
2819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ent = xmlGetDocEntity(node->doc, value);
2820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
2821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((ent == NULL) ||
2822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        (ent->etype !=
2823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         XML_EXTERNAL_GENERAL_UNPARSED_ENTITY))
2824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = 4;
2825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
2826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((ret == 0) && (val != NULL)) {
2827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    TODO;
2828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
2829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((ret == 0) && (node != NULL) &&
2830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (node->type == XML_ATTRIBUTE_NODE)) {
2831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlAttrPtr attr = (xmlAttrPtr) node;
2832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    attr->atype = XML_ATTRIBUTE_ENTITY;
2834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
2835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                goto done;
2836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
2837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_ENTITIES:
2838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((node == NULL) || (node->doc == NULL))
2839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                goto return3;
2840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlSchemaValAtomicListNode(xmlSchemaTypeEntityDef,
2841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                             value, val, node);
2842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret <= 0)
2843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = 1;
2844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else
2845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = 0;
2846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((ret == 0) && (node != NULL) &&
2847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (node->type == XML_ATTRIBUTE_NODE)) {
2848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAttrPtr attr = (xmlAttrPtr) node;
2849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                attr->atype = XML_ATTRIBUTE_ENTITIES;
2851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
2852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            goto done;
2853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_NOTATION:{
2854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlChar *uri = NULL;
2855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlChar *local = NULL;
2856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = xmlValidateQName(value, 1);
2858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((ret == 0) && (node != NULL)) {
2859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlChar *prefix;
2860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    local = xmlSplitQName2(value, &prefix);
2862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (prefix != NULL) {
2863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlNsPtr ns;
2864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ns = xmlSearchNs(node->doc, node, prefix);
2866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (ns == NULL)
2867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ret = 1;
2868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        else if (val != NULL)
2869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            uri = xmlStrdup(ns->href);
2870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
2871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((local != NULL) && ((val == NULL) || (ret != 0)))
2872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(local);
2873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (prefix != NULL)
2874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(prefix);
2875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
2876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((node == NULL) || (node->doc == NULL))
2877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = 3;
2878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret == 0) {
2879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = xmlValidateNotationUse(NULL, node->doc, value);
2880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ret == 1)
2881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = 0;
2882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    else
2883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = 1;
2884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
2885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((ret == 0) && (val != NULL)) {
2886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    v = xmlSchemaNewValue(XML_SCHEMAS_NOTATION);
2887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (v != NULL) {
2888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (local != NULL)
2889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            v->value.qname.name = local;
2890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        else
2891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            v->value.qname.name = xmlStrdup(value);
2892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (uri != NULL)
2893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            v->value.qname.uri = uri;
2894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        *val = v;
2896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else {
2897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (local != NULL)
2898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlFree(local);
2899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (uri != NULL)
2900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlFree(uri);
2901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto error;
2902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
2903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
2904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                goto done;
2905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
290694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun        case XML_SCHEMAS_ANYURI:{
2907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (*value != 0) {
2908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlURIPtr uri;
2909df143a5041f03a22808b59c76698770b74692815Selim Gurun		    xmlChar *tmpval, *cur;
291094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		    if (normOnTheFly) {
2911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			norm = xmlSchemaCollapseString(value);
2912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (norm != NULL)
2913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    value = norm;
2914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
2915df143a5041f03a22808b59c76698770b74692815Selim Gurun		    tmpval = xmlStrdup(value);
2916df143a5041f03a22808b59c76698770b74692815Selim Gurun		    for (cur = tmpval; *cur; ++cur) {
2917df143a5041f03a22808b59c76698770b74692815Selim Gurun			if (*cur < 32 || *cur >= 127 || *cur == ' ' ||
2918df143a5041f03a22808b59c76698770b74692815Selim Gurun			    *cur == '<' || *cur == '>' || *cur == '"' ||
2919df143a5041f03a22808b59c76698770b74692815Selim Gurun			    *cur == '{' || *cur == '}' || *cur == '|' ||
2920df143a5041f03a22808b59c76698770b74692815Selim Gurun			    *cur == '\\' || *cur == '^' || *cur == '`' ||
2921df143a5041f03a22808b59c76698770b74692815Selim Gurun			    *cur == '\'')
2922df143a5041f03a22808b59c76698770b74692815Selim Gurun			    *cur = '_';
2923df143a5041f03a22808b59c76698770b74692815Selim Gurun		    }
2924df143a5041f03a22808b59c76698770b74692815Selim Gurun                    uri = xmlParseURI((const char *) tmpval);
2925df143a5041f03a22808b59c76698770b74692815Selim Gurun		    xmlFree(tmpval);
2926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (uri == NULL)
2927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto return1;
2928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlFreeURI(uri);
2929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
2930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (val != NULL) {
2932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    v = xmlSchemaNewValue(XML_SCHEMAS_ANYURI);
2933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (v == NULL)
2934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto error;
2935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    v->value.str = xmlStrdup(value);
2936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    *val = v;
2937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
2938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                goto return0;
2939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
2940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_HEXBINARY:{
2941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                const xmlChar *cur = value, *start;
2942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlChar *base;
2943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                int total, i = 0;
2944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (cur == NULL)
2946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    goto return1;
2947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (normOnTheFly)
2949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    while IS_WSP_BLANK_CH(*cur) cur++;
2950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		start = cur;
2952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (((*cur >= '0') && (*cur <= '9')) ||
2953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       ((*cur >= 'A') && (*cur <= 'F')) ||
2954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       ((*cur >= 'a') && (*cur <= 'f'))) {
2955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    i++;
2956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    cur++;
2957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
2958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (normOnTheFly)
2959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    while IS_WSP_BLANK_CH(*cur) cur++;
2960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (*cur != 0)
2962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    goto return1;
2963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((i % 2) != 0)
2964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    goto return1;
2965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (val != NULL) {
2967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    v = xmlSchemaNewValue(XML_SCHEMAS_HEXBINARY);
2969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (v == NULL)
2970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto error;
2971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
2972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Copy only the normalized piece.
2973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * CRITICAL TODO: Check this.
2974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
2975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    cur = xmlStrndup(start, i);
2976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (cur == NULL) {
2977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        xmlSchemaTypeErrMemory(node, "allocating hexbin data");
2978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(v);
2979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto return1;
2980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
2981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    total = i / 2;      /* number of octets */
2983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    base = (xmlChar *) cur;
2985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    while (i-- > 0) {
2986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (*base >= 'a')
2987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            *base = *base - ('a' - 'A');
2988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        base++;
2989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
2990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    v->value.hex.str = (xmlChar *) cur;
2992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    v->value.hex.total = total;
2993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    *val = v;
2994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
2995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                goto return0;
2996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
2997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_BASE64BINARY:{
2998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /* ISSUE:
299994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun                 *
3000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * Ignore all stray characters? (yes, currently)
3001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * Worry about long lines? (no, currently)
300294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun                 *
3003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * rfc2045.txt:
300494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun                 *
3005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * "The encoded output stream must be represented in lines of
3006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * no more than 76 characters each.  All line breaks or other
3007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * characters not found in Table 1 must be ignored by decoding
3008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * software.  In base64 data, characters other than those in
3009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * Table 1, line breaks, and other white space probably
3010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * indicate a transmission error, about which a warning
3011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * message or even a message rejection might be appropriate
3012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * under some circumstances." */
3013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                const xmlChar *cur = value;
3014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlChar *base;
3015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                int total, i = 0, pad = 0;
3016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (cur == NULL)
3018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    goto return1;
3019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                for (; *cur; ++cur) {
3021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    int decc;
3022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    decc = _xmlSchemaBase64Decode(*cur);
3024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (decc < 0) ;
3025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    else if (decc < 64)
3026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        i++;
3027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    else
3028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
3029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                for (; *cur; ++cur) {
3031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    int decc;
3032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    decc = _xmlSchemaBase64Decode(*cur);
3034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (decc < 0) ;
3035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    else if (decc < 64)
3036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto return1;
3037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (decc == 64)
3038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        pad++;
3039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /* rfc2045.txt: "Special processing is performed if fewer than
3042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * 24 bits are available at the end of the data being encoded.
3043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * A full encoding quantum is always completed at the end of a
3044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * body.  When fewer than 24 input bits are available in an
3045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * input group, zero bits are added (on the right) to form an
3046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * integral number of 6-bit groups.  Padding at the end of the
3047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * data is performed using the "=" character.  Since all
3048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * base64 input is an integral number of octets, only the
3049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * following cases can arise: (1) the final quantum of
3050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * encoding input is an integral multiple of 24 bits; here,
3051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * the final unit of encoded output will be an integral
3052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * multiple ofindent: Standard input:701: Warning:old style
3053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * assignment ambiguity in "=*".  Assuming "= *" 4 characters
3054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * with no "=" padding, (2) the final
3055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * quantum of encoding input is exactly 8 bits; here, the
3056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * final unit of encoded output will be two characters
3057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * followed by two "=" padding characters, or (3) the final
3058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * quantum of encoding input is exactly 16 bits; here, the
3059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * final unit of encoded output will be three characters
3060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * followed by one "=" padding character." */
3061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                total = 3 * (i / 4);
3063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (pad == 0) {
3064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (i % 4 != 0)
3065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto return1;
3066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if (pad == 1) {
3067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    int decc;
3068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (i % 4 != 3)
3070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto return1;
3071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    for (decc = _xmlSchemaBase64Decode(*cur);
3072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         (decc < 0) || (decc > 63);
3073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         decc = _xmlSchemaBase64Decode(*cur))
3074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        --cur;
3075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /* 16bits in 24bits means 2 pad bits: nnnnnn nnmmmm mmmm00*/
3076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /* 00111100 -> 0x3c */
3077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (decc & ~0x3c)
3078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto return1;
3079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    total += 2;
3080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if (pad == 2) {
3081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    int decc;
3082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (i % 4 != 2)
3084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto return1;
3085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    for (decc = _xmlSchemaBase64Decode(*cur);
3086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         (decc < 0) || (decc > 63);
3087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         decc = _xmlSchemaBase64Decode(*cur))
3088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        --cur;
3089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /* 8bits in 12bits means 4 pad bits: nnnnnn nn0000 */
3090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /* 00110000 -> 0x30 */
3091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (decc & ~0x30)
3092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto return1;
3093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    total += 1;
3094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else
3095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    goto return1;
3096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (val != NULL) {
3098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    v = xmlSchemaNewValue(XML_SCHEMAS_BASE64BINARY);
3099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (v == NULL)
3100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto error;
3101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    base =
3102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        (xmlChar *) xmlMallocAtomic((i + pad + 1) *
3103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                    sizeof(xmlChar));
3104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (base == NULL) {
3105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        xmlSchemaTypeErrMemory(node, "allocating base64 data");
3106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(v);
3107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto return1;
3108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
3109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    v->value.base64.str = base;
3110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    for (cur = value; *cur; ++cur)
3111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (_xmlSchemaBase64Decode(*cur) >= 0) {
3112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            *base = *cur;
3113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ++base;
3114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
3115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    *base = 0;
3116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    v->value.base64.total = total;
3117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    *val = v;
3118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                goto return0;
3120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_INTEGER:
3122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_PINTEGER:
3123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_NPINTEGER:
3124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_NINTEGER:
3125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_NNINTEGER:{
3126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                const xmlChar *cur = value;
3127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                unsigned long lo, mi, hi;
3128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                int sign = 0;
3129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (cur == NULL)
3131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    goto return1;
3132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (normOnTheFly)
3133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    while IS_WSP_BLANK_CH(*cur) cur++;
3134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (*cur == '-') {
3135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    sign = 1;
3136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    cur++;
3137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if (*cur == '+')
3138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    cur++;
3139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi);
314060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott                if (ret < 0)
3141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    goto return1;
3142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (normOnTheFly)
3143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    while IS_WSP_BLANK_CH(*cur) cur++;
3144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (*cur != 0)
3145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    goto return1;
3146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (type->builtInType == XML_SCHEMAS_NPINTEGER) {
3147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((sign == 0) &&
3148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ((hi != 0) || (mi != 0) || (lo != 0)))
3149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto return1;
3150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if (type->builtInType == XML_SCHEMAS_PINTEGER) {
3151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (sign == 1)
3152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto return1;
3153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((hi == 0) && (mi == 0) && (lo == 0))
3154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto return1;
3155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if (type->builtInType == XML_SCHEMAS_NINTEGER) {
3156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (sign == 0)
3157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto return1;
3158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((hi == 0) && (mi == 0) && (lo == 0))
3159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto return1;
3160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if (type->builtInType == XML_SCHEMAS_NNINTEGER) {
3161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((sign == 1) &&
3162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ((hi != 0) || (mi != 0) || (lo != 0)))
3163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto return1;
3164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (val != NULL) {
3166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    v = xmlSchemaNewValue(type->builtInType);
3167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (v != NULL) {
3168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (ret == 0)
3169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret++;
3170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        v->value.decimal.lo = lo;
3171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        v->value.decimal.mi = mi;
3172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        v->value.decimal.hi = hi;
3173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        v->value.decimal.sign = sign;
3174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        v->value.decimal.frac = 0;
3175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        v->value.decimal.total = ret;
3176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        *val = v;
3177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
3178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                goto return0;
3180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_LONG:
3182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_BYTE:
3183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_SHORT:
3184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_INT:{
318560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott                const xmlChar *cur = value;
3186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                unsigned long lo, mi, hi;
3187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                int sign = 0;
3188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (cur == NULL)
3190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    goto return1;
3191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (*cur == '-') {
3192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    sign = 1;
3193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    cur++;
3194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if (*cur == '+')
3195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    cur++;
3196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi);
3197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret < 0)
3198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    goto return1;
3199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (*cur != 0)
3200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    goto return1;
3201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (type->builtInType == XML_SCHEMAS_LONG) {
3202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (hi >= 922) {
3203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (hi > 922)
3204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            goto return1;
3205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (mi >= 33720368) {
3206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (mi > 33720368)
3207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                goto return1;
3208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if ((sign == 0) && (lo > 54775807))
3209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                goto return1;
3210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if ((sign == 1) && (lo > 54775808))
3211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                goto return1;
3212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
3213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
3214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if (type->builtInType == XML_SCHEMAS_INT) {
3215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (hi != 0)
3216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto return1;
3217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (mi >= 21) {
3218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (mi > 21)
3219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            goto return1;
3220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if ((sign == 0) && (lo > 47483647))
3221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            goto return1;
3222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if ((sign == 1) && (lo > 47483648))
3223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            goto return1;
3224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
3225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if (type->builtInType == XML_SCHEMAS_SHORT) {
3226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((mi != 0) || (hi != 0))
3227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto return1;
3228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((sign == 1) && (lo > 32768))
3229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto return1;
3230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((sign == 0) && (lo > 32767))
3231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto return1;
3232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if (type->builtInType == XML_SCHEMAS_BYTE) {
3233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((mi != 0) || (hi != 0))
3234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto return1;
3235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((sign == 1) && (lo > 128))
3236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto return1;
3237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((sign == 0) && (lo > 127))
3238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto return1;
3239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (val != NULL) {
3241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    v = xmlSchemaNewValue(type->builtInType);
3242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (v != NULL) {
3243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        v->value.decimal.lo = lo;
3244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        v->value.decimal.mi = mi;
3245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        v->value.decimal.hi = hi;
3246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        v->value.decimal.sign = sign;
3247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        v->value.decimal.frac = 0;
3248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        v->value.decimal.total = ret;
3249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        *val = v;
3250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
3251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                goto return0;
3253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_UINT:
3255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_ULONG:
3256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_USHORT:
3257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_UBYTE:{
3258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                const xmlChar *cur = value;
3259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                unsigned long lo, mi, hi;
3260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (cur == NULL)
3262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    goto return1;
3263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi);
3264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret < 0)
3265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    goto return1;
3266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (*cur != 0)
3267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    goto return1;
3268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (type->builtInType == XML_SCHEMAS_ULONG) {
3269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (hi >= 1844) {
3270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (hi > 1844)
3271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            goto return1;
3272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (mi >= 67440737) {
3273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (mi > 67440737)
3274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                goto return1;
3275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (lo > 9551615)
3276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                goto return1;
3277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
3278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
3279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if (type->builtInType == XML_SCHEMAS_UINT) {
3280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (hi != 0)
3281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto return1;
3282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (mi >= 42) {
3283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (mi > 42)
3284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            goto return1;
3285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (lo > 94967295)
3286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            goto return1;
3287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
3288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if (type->builtInType == XML_SCHEMAS_USHORT) {
3289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((mi != 0) || (hi != 0))
3290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto return1;
3291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (lo > 65535)
3292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto return1;
3293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if (type->builtInType == XML_SCHEMAS_UBYTE) {
3294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((mi != 0) || (hi != 0))
3295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto return1;
3296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (lo > 255)
3297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto return1;
3298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (val != NULL) {
3300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    v = xmlSchemaNewValue(type->builtInType);
3301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (v != NULL) {
3302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        v->value.decimal.lo = lo;
3303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        v->value.decimal.mi = mi;
3304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        v->value.decimal.hi = hi;
3305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        v->value.decimal.sign = 0;
3306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        v->value.decimal.frac = 0;
3307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        v->value.decimal.total = ret;
3308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        *val = v;
3309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
3310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                goto return0;
3312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  done:
3316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (norm != NULL)
3317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(norm);
3318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
3319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  return3:
3320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (norm != NULL)
3321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(norm);
3322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (3);
3323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  return1:
3324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (norm != NULL)
3325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(norm);
3326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (1);
3327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  return0:
3328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (norm != NULL)
3329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(norm);
3330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
3331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  error:
3332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (norm != NULL)
3333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(norm);
3334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (-1);
3335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaValPredefTypeNode:
3339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the predefined type
3340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the value to check
3341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the return computed value
3342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the node containing the value
3343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check that a value conforms to the lexical space of the predefined type.
3345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if true a value is computed and returned in @val.
3346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if this validates, a positive error code number otherwise
3348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         and -1 in case of internal or API error.
3349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
3351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValPredefTypeNode(xmlSchemaTypePtr type, const xmlChar *value,
3352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                   xmlSchemaValPtr *val, xmlNodePtr node) {
3353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlSchemaValAtomicType(type, value, val, node, 0,
3354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XML_SCHEMA_WHITESPACE_UNKNOWN, 1, 1, 0));
3355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaValPredefTypeNodeNoNorm:
3359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the predefined type
3360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the value to check
3361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the return computed value
3362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the node containing the value
3363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check that a value conforms to the lexical space of the predefined type.
3365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if true a value is computed and returned in @val.
3366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This one does apply any normalization to the value.
3367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if this validates, a positive error code number otherwise
3369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         and -1 in case of internal or API error.
3370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
3372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValPredefTypeNodeNoNorm(xmlSchemaTypePtr type, const xmlChar *value,
3373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 xmlSchemaValPtr *val, xmlNodePtr node) {
3374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlSchemaValAtomicType(type, value, val, node, 1,
3375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XML_SCHEMA_WHITESPACE_UNKNOWN, 1, 0, 1));
3376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaValidatePredefinedType:
3380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the predefined type
3381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the value to check
3382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the return computed value
3383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check that a value conforms to the lexical space of the predefined type.
3385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if true a value is computed and returned in @val.
3386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if this validates, a positive error code number otherwise
3388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         and -1 in case of internal or API error.
3389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
3391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidatePredefinedType(xmlSchemaTypePtr type, const xmlChar *value,
3392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                        xmlSchemaValPtr *val) {
3393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlSchemaValPredefTypeNode(type, value, val, NULL));
3394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCompareDecimals:
3398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @x:  a first decimal value
3399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @y:  a second decimal value
3400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare 2 decimals
3402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 if x < y, 0 if x == y, 1 if x > y and -2 in case of error
3404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
3406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCompareDecimals(xmlSchemaValPtr x, xmlSchemaValPtr y)
3407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValPtr swp;
3409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int order = 1, integx, integy, dlen;
3410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned long hi, mi, lo;
3411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * First test: If x is -ve and not zero
3414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
341594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    if ((x->value.decimal.sign) &&
3416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((x->value.decimal.lo != 0) ||
3417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 (x->value.decimal.mi != 0) ||
3418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 (x->value.decimal.hi != 0))) {
3419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
3420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * Then if y is -ve and not zero reverse the compare
3421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
3422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((y->value.decimal.sign) &&
3423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((y->value.decimal.lo != 0) ||
3424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     (y->value.decimal.mi != 0) ||
3425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     (y->value.decimal.hi != 0)))
3426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    order = -1;
3427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
3428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * Otherwise (y >= 0) we have the answer
3429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
3430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
3431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
3432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * If x is not -ve and y is -ve we have the answer
3434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if ((y->value.decimal.sign) &&
3436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       ((y->value.decimal.lo != 0) ||
3437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(y->value.decimal.mi != 0) ||
3438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(y->value.decimal.hi != 0))) {
3439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (1);
3440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * If it's not simply determined by a difference in sign,
3443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * then we need to compare the actual values of the two nums.
3444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * To do this, we start by looking at the integral parts.
3445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * If the number of integral digits differ, then we have our
3446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * answer.
3447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    integx = x->value.decimal.total - x->value.decimal.frac;
3449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    integy = y->value.decimal.total - y->value.decimal.frac;
3450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * NOTE: We changed the "total" for values like "0.1"
3452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   (or "-0.1" or ".1") to be 1, which was 2 previously.
3453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   Therefore the special case, when such values are
3454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   compared with 0, needs to be handled separately;
3455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   otherwise a zero would be recognized incorrectly as
3456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   greater than those values. This has the nice side effect
3457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   that we gain an overall optimized comparison with zeroes.
3458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Note that a "0" has a "total" of 1 already.
3459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
3460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (integx == 1) {
3461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (x->value.decimal.lo == 0) {
3462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (integy != 1)
3463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return -order;
3464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else if (y->value.decimal.lo != 0)
3465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return -order;
3466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
3467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
3468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (integy == 1) {
3471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (y->value.decimal.lo == 0) {
3472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (integx != 1)
3473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return order;
3474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else if (x->value.decimal.lo != 0)
3475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return order;
3476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
3477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
3478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (integx > integy)
3482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return order;
3483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (integy > integx)
3484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return -order;
3485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * If the number of integral digits is the same for both numbers,
3488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * then things get a little more complicated.  We need to "normalize"
3489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * the numbers in order to properly compare them.  To do this, we
3490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * look at the total length of each number (length => number of
3491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * significant digits), and divide the "shorter" by 10 (decreasing
3492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * the length) until they are of equal length.
3493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    dlen = x->value.decimal.total - y->value.decimal.total;
3495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (dlen < 0) {	/* y has more digits than x */
3496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	swp = x;
3497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	hi = y->value.decimal.hi;
3498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	mi = y->value.decimal.mi;
3499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	lo = y->value.decimal.lo;
3500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	dlen = -dlen;
3501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	order = -order;
3502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {		/* x has more digits than y */
3503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	swp = y;
3504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	hi = x->value.decimal.hi;
3505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	mi = x->value.decimal.mi;
3506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	lo = x->value.decimal.lo;
3507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (dlen > 8) {	/* in effect, right shift by 10**8 */
3509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	lo = mi;
3510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	mi = hi;
3511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	hi = 0;
3512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	dlen -= 8;
3513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (dlen > 0) {
3515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	unsigned long rem1, rem2;
3516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	rem1 = (hi % 10) * 100000000L;
3517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	hi = hi / 10;
3518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	rem2 = (mi % 10) * 100000000L;
3519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	mi = (mi + rem1) / 10;
3520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	lo = (lo + rem2) / 10;
3521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	dlen--;
3522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (hi > swp->value.decimal.hi) {
3524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return order;
3525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (hi == swp->value.decimal.hi) {
3526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (mi > swp->value.decimal.mi) {
3527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return order;
3528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (mi == swp->value.decimal.mi) {
3529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (lo > swp->value.decimal.lo) {
3530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return order;
3531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (lo == swp->value.decimal.lo) {
3532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (x->value.decimal.total == y->value.decimal.total) {
3533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return 0;
3534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
3535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return order;
3536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
3537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return -order;
3541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCompareDurations:
3545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @x:  a first duration value
3546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @y:  a second duration value
3547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare 2 durations
3549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
3551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * case of error
3552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
3554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCompareDurations(xmlSchemaValPtr x, xmlSchemaValPtr y)
3555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    long carry, mon, day;
3557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double sec;
3558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int invert = 1;
3559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    long xmon, xday, myear, minday, maxday;
3560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    static const long dayRange [2][12] = {
3561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        { 0, 28, 59, 89, 120, 150, 181, 212, 242, 273, 303, 334, },
3562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        { 0, 31, 62, 92, 123, 153, 184, 215, 245, 276, 306, 337} };
3563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((x == NULL) || (y == NULL))
3565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return -2;
3566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* months */
3568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    mon = x->value.dur.mon - y->value.dur.mon;
3569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* seconds */
3571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    sec = x->value.dur.sec - y->value.dur.sec;
3572df143a5041f03a22808b59c76698770b74692815Selim Gurun    carry = (long)(sec / SECS_PER_DAY);
3573df143a5041f03a22808b59c76698770b74692815Selim Gurun    sec -= ((double)carry) * SECS_PER_DAY;
3574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* days */
3576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    day = x->value.dur.day - y->value.dur.day + carry;
3577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* easy test */
3579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (mon == 0) {
3580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (day == 0)
3581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (sec == 0.0)
3582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return 0;
3583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else if (sec < 0.0)
3584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return -1;
3585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else
3586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return 1;
3587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (day < 0)
3588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return -1;
3589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else
3590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return 1;
3591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (mon > 0) {
3594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((day >= 0) && (sec >= 0.0))
3595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return 1;
3596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else {
3597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmon = mon;
3598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xday = -day;
3599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if ((day <= 0) && (sec <= 0.0)) {
3601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return -1;
3602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
3603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	invert = -1;
3604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmon = -mon;
3605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xday = day;
3606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    myear = xmon / 12;
3609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (myear == 0) {
3610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	minday = 0;
3611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	maxday = 0;
3612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
3613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	maxday = 366 * ((myear + 3) / 4) +
3614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	         365 * ((myear - 1) % 4);
3615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	minday = maxday - 1;
3616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmon = xmon % 12;
3619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    minday += dayRange[0][xmon];
3620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    maxday += dayRange[1][xmon];
3621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((maxday == minday) && (maxday == xday))
3623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0); /* can this really happen ? */
3624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (maxday < xday)
3625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-invert);
3626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (minday > xday)
3627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(invert);
3628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* indeterminate */
3630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return 2;
3631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
3634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * macros for adding date/times and durations
3635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define FQUOTIENT(a,b)                  (floor(((double)a/(double)b)))
3637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define MODULO(a,b)                     (a - FQUOTIENT(a,b) * b)
3638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define FQUOTIENT_RANGE(a,low,high)     (FQUOTIENT((a-low),(high-low)))
3639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define MODULO_RANGE(a,low,high)        ((MODULO((a-low),(high-low)))+low)
3640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaDupVal:
3643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @v: the #xmlSchemaValPtr value to duplicate
3644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Makes a copy of @v. The calling program is responsible for freeing
3646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the returned value.
3647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns a pointer to a duplicated #xmlSchemaValPtr or NULL if error.
3649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaValPtr
3651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaDupVal (xmlSchemaValPtr v)
3652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValPtr ret = xmlSchemaNewValue(v->type);
3654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL)
3655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return NULL;
365694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
3657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memcpy(ret, v, sizeof(xmlSchemaVal));
3658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->next = NULL;
3659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return ret;
3660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCopyValue:
3664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the precomputed value to be copied
3665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Copies the precomputed value. This duplicates any string within.
3667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the copy or NULL if a copy for a data-type is not implemented.
3669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValPtr
3671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCopyValue(xmlSchemaValPtr val)
3672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValPtr ret = NULL, prev = NULL, cur;
3674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Copy the string values.
3677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
3678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (val != NULL) {
3679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (val->type) {
3680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_ANYTYPE:
3681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_IDREFS:
3682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_ENTITIES:
3683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_NMTOKENS:
3684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFreeValue(ret);
3685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (NULL);
3686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_ANYSIMPLETYPE:
3687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_STRING:
3688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_NORMSTRING:
3689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_TOKEN:
3690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_LANGUAGE:
3691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_NAME:
3692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_NCNAME:
3693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_ID:
3694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_IDREF:
3695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_ENTITY:
3696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_NMTOKEN:
3697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_ANYURI:
3698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = xmlSchemaDupVal(val);
3699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (val->value.str != NULL)
3700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cur->value.str = xmlStrdup(BAD_CAST val->value.str);
3701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
370294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    case XML_SCHEMAS_QNAME:
3703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_NOTATION:
3704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = xmlSchemaDupVal(val);
3705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (val->value.qname.name != NULL)
3706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cur->value.qname.name =
3707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlStrdup(BAD_CAST val->value.qname.name);
3708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (val->value.qname.uri != NULL)
3709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cur->value.qname.uri =
3710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlStrdup(BAD_CAST val->value.qname.uri);
3711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
3712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_HEXBINARY:
3713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = xmlSchemaDupVal(val);
3714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (val->value.hex.str != NULL)
3715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cur->value.hex.str = xmlStrdup(BAD_CAST val->value.hex.str);
3716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
3717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_BASE64BINARY:
3718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = xmlSchemaDupVal(val);
3719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (val->value.base64.str != NULL)
3720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cur->value.base64.str =
3721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlStrdup(BAD_CAST val->value.base64.str);
3722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
3723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
3724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = xmlSchemaDupVal(val);
3725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
3726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret == NULL)
3728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = cur;
3729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
3730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    prev->next = cur;
3731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	prev = cur;
3732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	val = val->next;
3733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
3735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * _xmlSchemaDateAdd:
3739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dt: an #xmlSchemaValPtr
3740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dur: an #xmlSchemaValPtr of type #XS_DURATION
3741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compute a new date/time from @dt and @dur. This function assumes @dt
3743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is either #XML_SCHEMAS_DATETIME, #XML_SCHEMAS_DATE, #XML_SCHEMAS_GYEARMONTH,
3744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or #XML_SCHEMAS_GYEAR. The returned #xmlSchemaVal is the same type as
3745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dt. The calling program is responsible for freeing the returned value.
3746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a pointer to a new #xmlSchemaVal or NULL if error.
3748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaValPtr
3750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project_xmlSchemaDateAdd (xmlSchemaValPtr dt, xmlSchemaValPtr dur)
3751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValPtr ret, tmp;
3753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    long carry, tempdays, temp;
3754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValDatePtr r, d;
3755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValDurationPtr u;
3756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((dt == NULL) || (dur == NULL))
3758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return NULL;
3759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaNewValue(dt->type);
3761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL)
3762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return NULL;
3763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* make a copy so we don't alter the original value */
3765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    tmp = xmlSchemaDupVal(dt);
3766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (tmp == NULL) {
3767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaFreeValue(ret);
3768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return NULL;
3769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    r = &(ret->value.date);
3772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    d = &(tmp->value.date);
3773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    u = &(dur->value.dur);
3774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* normalization */
3776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (d->mon == 0)
3777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        d->mon = 1;
3778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* normalize for time zone offset */
3780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    u->sec -= (d->tzo * 60);
3781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    d->tzo = 0;
3782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* normalization */
3784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (d->day == 0)
3785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        d->day = 1;
3786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* month */
3788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    carry  = d->mon + u->mon;
3789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    r->mon = (unsigned int) MODULO_RANGE(carry, 1, 13);
3790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    carry  = (long) FQUOTIENT_RANGE(carry, 1, 13);
3791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* year (may be modified later) */
3793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    r->year = d->year + carry;
3794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (r->year == 0) {
3795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (d->year > 0)
3796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            r->year--;
3797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else
3798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            r->year++;
3799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* time zone */
3802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    r->tzo     = d->tzo;
3803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    r->tz_flag = d->tz_flag;
3804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* seconds */
3806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    r->sec = d->sec + u->sec;
3807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    carry  = (long) FQUOTIENT((long)r->sec, 60);
3808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (r->sec != 0.0) {
3809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        r->sec = MODULO(r->sec, 60.0);
3810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* minute */
3813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    carry += d->min;
3814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    r->min = (unsigned int) MODULO(carry, 60);
3815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    carry  = (long) FQUOTIENT(carry, 60);
3816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* hours */
3818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    carry  += d->hour;
3819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    r->hour = (unsigned int) MODULO(carry, 24);
3820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    carry   = (long)FQUOTIENT(carry, 24);
3821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * days
3824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Note we use tempdays because the temporary values may need more
3825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * than 5 bits
3826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((VALID_YEAR(r->year)) && (VALID_MONTH(r->mon)) &&
3828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                  (d->day > MAX_DAYINMONTH(r->year, r->mon)))
3829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tempdays = MAX_DAYINMONTH(r->year, r->mon);
3830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (d->day < 1)
3831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tempdays = 1;
3832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
3833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tempdays = d->day;
3834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    tempdays += u->day + carry;
3836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (1) {
3838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (tempdays < 1) {
3839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            long tmon = (long) MODULO_RANGE((int)r->mon-1, 1, 13);
3840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            long tyr  = r->year + (long)FQUOTIENT_RANGE((int)r->mon-1, 1, 13);
3841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (tyr == 0)
3842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tyr--;
3843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
384494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	     * Coverity detected an overrun in daysInMonth
3845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * of size 12 at position 12 with index variable "((r)->mon - 1)"
3846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
3847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmon < 0)
3848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        tmon = 0;
3849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmon > 12)
3850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        tmon = 12;
3851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tempdays += MAX_DAYINMONTH(tyr, tmon);
3852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            carry = -1;
3853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (tempdays > (long) MAX_DAYINMONTH(r->year, r->mon)) {
3854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tempdays = tempdays - MAX_DAYINMONTH(r->year, r->mon);
3855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            carry = 1;
3856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else
3857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
3858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        temp = r->mon + carry;
3860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        r->mon = (unsigned int) MODULO_RANGE(temp, 1, 13);
3861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        r->year = r->year + (unsigned int) FQUOTIENT_RANGE(temp, 1, 13);
3862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (r->year == 0) {
3863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (temp < 1)
3864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                r->year--;
3865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else
3866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                r->year++;
3867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
386994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
3870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    r->day = tempdays;
3871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * adjust the date/time type to the date values
3874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret->type != XML_SCHEMAS_DATETIME) {
3876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((r->hour) || (r->min) || (r->sec))
3877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->type = XML_SCHEMAS_DATETIME;
3878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (ret->type != XML_SCHEMAS_DATE) {
3879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((r->mon != 1) && (r->day != 1))
3880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret->type = XML_SCHEMAS_DATE;
3881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else if ((ret->type != XML_SCHEMAS_GYEARMONTH) && (r->mon != 1))
3882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret->type = XML_SCHEMAS_GYEARMONTH;
3883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFreeValue(tmp);
3887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return ret;
3889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaDateNormalize:
3893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dt: an #xmlSchemaValPtr of a date/time type value.
3894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @offset: number of seconds to adjust @dt by.
3895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Normalize @dt to GMT time. The @offset parameter is subtracted from
3897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the return value is a time-zone offset is present on @dt.
3898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a normalized copy of @dt or NULL if error.
3900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaValPtr
3902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaDateNormalize (xmlSchemaValPtr dt, double offset)
3903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValPtr dur, ret;
3905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (dt == NULL)
3907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return NULL;
3908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (((dt->type != XML_SCHEMAS_TIME) &&
3910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         (dt->type != XML_SCHEMAS_DATETIME) &&
3911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 (dt->type != XML_SCHEMAS_DATE)) || (dt->value.date.tzo == 0))
3912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return xmlSchemaDupVal(dt);
3913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION);
3915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (dur == NULL)
3916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return NULL;
3917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    dur->value.date.sec -= offset;
3919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = _xmlSchemaDateAdd(dt, dur);
3921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL)
3922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return NULL;
3923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFreeValue(dur);
3925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* ret->value.date.tzo = 0; */
3927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return ret;
3928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * _xmlSchemaDateCastYMToDays:
3932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dt: an #xmlSchemaValPtr
3933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
393494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Convert mon and year of @dt to total number of days. Take the
3935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number of years since (or before) 1 AD and add the number of leap
3936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * years. This is a function  because negative
3937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * years must be handled a little differently and there is no zero year.
3938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns number of days.
3940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic long
3942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project_xmlSchemaDateCastYMToDays (const xmlSchemaValPtr dt)
3943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    long ret;
3945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int mon;
3946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    mon = dt->value.date.mon;
3948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (mon <= 0) mon = 1; /* normalization */
3949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (dt->value.date.year <= 0)
3951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = (dt->value.date.year * 365) +
3952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project              (((dt->value.date.year+1)/4)-((dt->value.date.year+1)/100)+
3953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project               ((dt->value.date.year+1)/400)) +
3954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project              DAY_IN_YEAR(0, mon, dt->value.date.year);
3955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
3956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = ((dt->value.date.year-1) * 365) +
3957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project              (((dt->value.date.year-1)/4)-((dt->value.date.year-1)/100)+
3958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project               ((dt->value.date.year-1)/400)) +
3959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project              DAY_IN_YEAR(0, mon, dt->value.date.year);
3960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return ret;
3962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TIME_TO_NUMBER:
3966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dt:  an #xmlSchemaValPtr
3967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Calculates the number of seconds in the time portion of @dt.
3969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns seconds.
3971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define TIME_TO_NUMBER(dt)                              \
3973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ((double)((dt->value.date.hour * SECS_PER_HOUR) +   \
3974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project              (dt->value.date.min * SECS_PER_MIN) +	\
3975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project              (dt->value.date.tzo * SECS_PER_MIN)) +	\
3976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project               dt->value.date.sec)
3977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCompareDates:
3980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @x:  a first date/time value
3981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @y:  a second date/time value
3982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare 2 date/times
3984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
3986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * case of error
3987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
3989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCompareDates (xmlSchemaValPtr x, xmlSchemaValPtr y)
3990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned char xmask, ymask, xor_mask, and_mask;
3992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValPtr p1, p2, q1, q2;
3993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    long p1d, p2d, q1d, q2d;
3994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((x == NULL) || (y == NULL))
3996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return -2;
3997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (x->value.date.tz_flag) {
3999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (!y->value.date.tz_flag) {
4001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            p1 = xmlSchemaDateNormalize(x, 0);
4002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day;
4003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /* normalize y + 14:00 */
4004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            q1 = xmlSchemaDateNormalize(y, (14 * SECS_PER_HOUR));
4005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day;
4007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (p1d < q1d) {
4008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFreeValue(p1);
4009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFreeValue(q1);
4010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return -1;
4011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (p1d == q1d) {
4012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                double sec;
4013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1);
4015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (sec < 0.0) {
4016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFreeValue(p1);
4017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFreeValue(q1);
4018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    return -1;
4019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
4020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    int ret = 0;
4021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /* normalize y - 14:00 */
4022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    q2 = xmlSchemaDateNormalize(y, -(14 * SECS_PER_HOUR));
4023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    q2d = _xmlSchemaDateCastYMToDays(q2) + q2->value.date.day;
4024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (p1d > q2d)
4025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = 1;
4026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    else if (p1d == q2d) {
4027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q2);
4028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (sec > 0.0)
4029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ret = 1;
4030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        else
4031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ret = 2; /* indeterminate */
4032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
4033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFreeValue(p1);
4034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFreeValue(q1);
4035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFreeValue(q2);
4036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ret != 0)
4037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        return(ret);
4038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
4039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
4040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFreeValue(p1);
4041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFreeValue(q1);
4042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
4043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (y->value.date.tz_flag) {
4045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        q1 = xmlSchemaDateNormalize(y, 0);
4046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day;
4047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /* normalize x - 14:00 */
4049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        p1 = xmlSchemaDateNormalize(x, -(14 * SECS_PER_HOUR));
4050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day;
4051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (p1d < q1d) {
4053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaFreeValue(p1);
4054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaFreeValue(q1);
4055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return -1;
4056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (p1d == q1d) {
4057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            double sec;
4058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1);
4060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (sec < 0.0) {
4061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFreeValue(p1);
4062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFreeValue(q1);
4063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return -1;
4064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
4065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        int ret = 0;
4066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /* normalize x + 14:00 */
4067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                p2 = xmlSchemaDateNormalize(x, (14 * SECS_PER_HOUR));
4068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                p2d = _xmlSchemaDateCastYMToDays(p2) + p2->value.date.day;
4069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (p2d > q1d) {
4071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = 1;
4072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (p2d == q1d) {
4073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    sec = TIME_TO_NUMBER(p2) - TIME_TO_NUMBER(q1);
4074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (sec > 0.0)
4075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = 1;
4076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    else
4077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = 2; /* indeterminate */
4078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
4079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFreeValue(p1);
4080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFreeValue(q1);
4081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFreeValue(p2);
4082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret != 0)
4083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(ret);
4084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
4086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaFreeValue(p1);
4087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaFreeValue(q1);
4088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
4092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * if the same type then calculate the difference
4093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
4094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (x->type == y->type) {
4095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        int ret = 0;
4096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        q1 = xmlSchemaDateNormalize(y, 0);
4097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day;
4098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        p1 = xmlSchemaDateNormalize(x, 0);
4100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day;
4101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (p1d < q1d) {
4103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = -1;
4104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (p1d > q1d) {
4105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = 1;
4106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
4107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            double sec;
4108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1);
4110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (sec < 0.0)
4111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = -1;
4112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else if (sec > 0.0)
4113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = 1;
411494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
4115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeValue(p1);
4117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeValue(q1);
4118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(ret);
4119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (x->type) {
4122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_DATETIME:
4123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmask = 0xf;
4124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_DATE:
4126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmask = 0x7;
4127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_GYEAR:
4129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmask = 0x1;
4130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_GMONTH:
4132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmask = 0x2;
4133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_GDAY:
4135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmask = 0x3;
4136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_GYEARMONTH:
4138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmask = 0x3;
4139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_GMONTHDAY:
4141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmask = 0x6;
4142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_TIME:
4144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmask = 0x8;
4145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        default:
4147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmask = 0;
4148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (y->type) {
4152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_DATETIME:
4153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ymask = 0xf;
4154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_DATE:
4156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ymask = 0x7;
4157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_GYEAR:
4159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ymask = 0x1;
4160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_GMONTH:
4162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ymask = 0x2;
4163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_GDAY:
4165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ymask = 0x3;
4166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_GYEARMONTH:
4168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ymask = 0x3;
4169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_GMONTHDAY:
4171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ymask = 0x6;
4172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_TIME:
4174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ymask = 0x8;
4175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        default:
4177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ymask = 0;
4178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xor_mask = xmask ^ ymask;           /* mark type differences */
4182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    and_mask = xmask & ymask;           /* mark field specification */
4183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* year */
4185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xor_mask & 1)
4186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return 2; /* indeterminate */
4187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (and_mask & 1) {
4188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (x->value.date.year < y->value.date.year)
4189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return -1;
4190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (x->value.date.year > y->value.date.year)
4191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return 1;
4192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* month */
4195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xor_mask & 2)
4196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return 2; /* indeterminate */
4197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (and_mask & 2) {
4198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (x->value.date.mon < y->value.date.mon)
4199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return -1;
4200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (x->value.date.mon > y->value.date.mon)
4201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return 1;
4202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* day */
4205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xor_mask & 4)
4206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return 2; /* indeterminate */
4207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (and_mask & 4) {
4208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (x->value.date.day < y->value.date.day)
4209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return -1;
4210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (x->value.date.day > y->value.date.day)
4211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return 1;
4212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* time */
4215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xor_mask & 8)
4216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return 2; /* indeterminate */
4217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (and_mask & 8) {
4218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (x->value.date.hour < y->value.date.hour)
4219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return -1;
4220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (x->value.date.hour > y->value.date.hour)
4221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return 1;
4222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (x->value.date.min < y->value.date.min)
4223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return -1;
4224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (x->value.date.min > y->value.date.min)
4225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return 1;
4226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (x->value.date.sec < y->value.date.sec)
4227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return -1;
4228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (x->value.date.sec > y->value.date.sec)
4229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return 1;
4230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return 0;
4233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaComparePreserveReplaceStrings:
4237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @x:  a first string value
4238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @y:  a second string value
4239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @invert: inverts the result if x < y or x > y.
4240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare 2 string for their normalized values.
4242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @x is a string with whitespace of "preserve", @y is
4243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a string with a whitespace of "replace". I.e. @x could
4244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * be an "xsd:string" and @y an "xsd:normalizedString".
4245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
4247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * case of error
4248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
4250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaComparePreserveReplaceStrings(const xmlChar *x,
4251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       const xmlChar *y,
4252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       int invert)
4253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int tmp;
425594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
4256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((*x != 0) && (*y != 0)) {
4257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (IS_WSP_REPLACE_CH(*y)) {
4258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (! IS_WSP_SPACE_CH(*x)) {
4259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((*x - 0x20) < 0) {
4260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (invert)
4261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(1);
4262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
4263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(-1);
4264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
4265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (invert)
4266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(-1);
4267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
4268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(1);
4269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
427094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    }
4271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
4272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp = *x - *y;
4273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp < 0) {
4274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (invert)
4275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(1);
4276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
4277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(-1);
4278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
4279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp > 0) {
4280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (invert)
4281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(-1);
4282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
4283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(1);
4284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
4285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	x++;
4287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	y++;
4288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*x != 0) {
4290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (invert)
4291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
4292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
4293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
4294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*y != 0) {
4296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (invert)
4297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
4298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
4299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
4300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
4302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaComparePreserveCollapseStrings:
4306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @x:  a first string value
4307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @y:  a second string value
4308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare 2 string for their normalized values.
4310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @x is a string with whitespace of "preserve", @y is
4311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a string with a whitespace of "collapse". I.e. @x could
4312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * be an "xsd:string" and @y an "xsd:normalizedString".
4313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
4315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * case of error
4316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
4318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaComparePreserveCollapseStrings(const xmlChar *x,
4319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				        const xmlChar *y,
4320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					int invert)
4321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int tmp;
4323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
432494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    /*
4325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Skip leading blank chars of the collapsed string.
4326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
4327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while IS_WSP_BLANK_CH(*y)
4328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	y++;
4329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((*x != 0) && (*y != 0)) {
4331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if IS_WSP_BLANK_CH(*y) {
4332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (! IS_WSP_SPACE_CH(*x)) {
4333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
4334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* The yv character would have been replaced to 0x20.
4335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
4336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((*x - 0x20) < 0) {
4337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (invert)
4338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(1);
4339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
4340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(-1);
4341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
4342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (invert)
4343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(-1);
4344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
4345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(1);
4346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
4347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
4348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    x++;
4349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    y++;
4350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
4351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Skip contiguous blank chars of the collapsed string.
4352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
4353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while IS_WSP_BLANK_CH(*y)
4354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		y++;
4355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
4356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp = *x++ - *y++;
4357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp < 0) {
4358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (invert)
4359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(1);
4360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
4361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(-1);
4362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
4363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp > 0) {
4364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (invert)
4365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(-1);
4366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
4367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(1);
4368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
4369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*x != 0) {
4372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 if (invert)
4373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     return(-1);
4374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 else
4375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     return(1);
4376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*y != 0) {
4378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
4379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Skip trailing blank chars of the collapsed string.
4380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
4381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while IS_WSP_BLANK_CH(*y)
4382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    y++;
4383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (*y != 0) {
4384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (invert)
4385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(1);
4386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
4387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
4388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
4391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaComparePreserveCollapseStrings:
4395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @x:  a first string value
4396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @y:  a second string value
4397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare 2 string for their normalized values.
4399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @x is a string with whitespace of "preserve", @y is
4400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a string with a whitespace of "collapse". I.e. @x could
4401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * be an "xsd:string" and @y an "xsd:normalizedString".
4402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
4404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * case of error
4405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
4407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCompareReplaceCollapseStrings(const xmlChar *x,
4408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       const xmlChar *y,
4409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       int invert)
4410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int tmp;
4412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
441394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    /*
4414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Skip leading blank chars of the collapsed string.
4415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
4416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while IS_WSP_BLANK_CH(*y)
4417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	y++;
441894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
4419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((*x != 0) && (*y != 0)) {
4420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if IS_WSP_BLANK_CH(*y) {
4421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (! IS_WSP_BLANK_CH(*x)) {
4422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
4423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* The yv character would have been replaced to 0x20.
4424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
4425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((*x - 0x20) < 0) {
4426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (invert)
4427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(1);
4428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
4429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(-1);
4430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
4431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (invert)
4432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(-1);
4433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
4434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(1);
4435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
4436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
4437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    x++;
443894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    y++;
443994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    /*
4440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Skip contiguous blank chars of the collapsed string.
4441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
4442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while IS_WSP_BLANK_CH(*y)
4443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		y++;
4444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
4445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if IS_WSP_BLANK_CH(*x) {
4446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
4447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* The xv character would have been replaced to 0x20.
4448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
4449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((0x20 - *y) < 0) {
4450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (invert)
4451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(1);
4452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
4453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(-1);
4454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
4455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (invert)
4456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(-1);
4457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
4458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(1);
4459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
4460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
4461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp = *x++ - *y++;
4462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp < 0)
4463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
4464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp > 0)
4465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(1);
4466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*x != 0) {
4469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 if (invert)
4470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     return(-1);
4471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 else
4472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     return(1);
447394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    }
4474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*y != 0) {
4475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
4476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Skip trailing blank chars of the collapsed string.
4477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
4478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while IS_WSP_BLANK_CH(*y)
4479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    y++;
4480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (*y != 0) {
4481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (invert)
4482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(1);
4483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
4484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
4485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
4488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCompareReplacedStrings:
4493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @x:  a first string value
4494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @y:  a second string value
4495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare 2 string for their normalized values.
4497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
4499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * case of error
4500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
4502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCompareReplacedStrings(const xmlChar *x,
4503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				const xmlChar *y)
4504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int tmp;
450694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
4507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((*x != 0) && (*y != 0)) {
4508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if IS_WSP_BLANK_CH(*y) {
4509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (! IS_WSP_BLANK_CH(*x)) {
4510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((*x - 0x20) < 0)
451194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		    return(-1);
4512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
4513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(1);
451494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    }
4515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
4516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if IS_WSP_BLANK_CH(*x) {
4517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((0x20 - *y) < 0)
451894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		    return(-1);
4519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
4520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(1);
4521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
4522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp = *x - *y;
4523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp < 0)
452494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		return(-1);
4525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp > 0)
452694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		return(1);
4527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	x++;
4529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	y++;
4530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*x != 0)
4532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(1);
4533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*y != 0)
4534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
4535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
4536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCompareNormStrings:
4540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @x:  a first string value
4541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @y:  a second string value
4542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare 2 string for their normalized values.
4544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
4546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * case of error
4547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
4549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCompareNormStrings(const xmlChar *x,
4550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    const xmlChar *y) {
4551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int tmp;
455294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
4553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (IS_BLANK_CH(*x)) x++;
4554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (IS_BLANK_CH(*y)) y++;
4555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((*x != 0) && (*y != 0)) {
4556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (IS_BLANK_CH(*x)) {
4557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (!IS_BLANK_CH(*y)) {
4558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp = *x - *y;
4559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(tmp);
4560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
4561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (IS_BLANK_CH(*x)) x++;
4562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (IS_BLANK_CH(*y)) y++;
4563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
4564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp = *x++ - *y++;
4565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp < 0)
4566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
4567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp > 0)
4568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(1);
4569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*x != 0) {
4572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (IS_BLANK_CH(*x)) x++;
4573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (*x != 0)
4574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
4575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*y != 0) {
4577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (IS_BLANK_CH(*y)) y++;
4578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (*y != 0)
4579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
4580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
4582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCompareFloats:
4586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @x:  a first float or double value
4587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @y:  a second float or double value
4588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare 2 values
4590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
4592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * case of error
4593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
4595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCompareFloats(xmlSchemaValPtr x, xmlSchemaValPtr y) {
4596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    double d1, d2;
4597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((x == NULL) || (y == NULL))
4599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-2);
4600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
4602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Cast everything to doubles.
4603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
4604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (x->type == XML_SCHEMAS_DOUBLE)
4605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	d1 = x->value.d;
4606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (x->type == XML_SCHEMAS_FLOAT)
4607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	d1 = x->value.f;
4608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
4609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-2);
4610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (y->type == XML_SCHEMAS_DOUBLE)
4612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	d2 = y->value.d;
4613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (y->type == XML_SCHEMAS_FLOAT)
4614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	d2 = y->value.f;
4615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
4616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-2);
4617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
4619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Check for special cases.
4620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
4621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathIsNaN(d1)) {
4622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlXPathIsNaN(d2))
4623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
4624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
4625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlXPathIsNaN(d2))
4627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
4628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (d1 == xmlXPathPINF) {
4629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (d2 == xmlXPathPINF)
4630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
4631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(1);
4632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (d2 == xmlXPathPINF)
4634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
4635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (d1 == xmlXPathNINF) {
4636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (d2 == xmlXPathNINF)
4637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
4638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
4639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (d2 == xmlXPathNINF)
4641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(1);
4642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
4644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * basic tests, the last one we should have equality, but
4645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * portability is more important than speed and handling
4646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * NaN or Inf in a portable way is always a challenge, so ...
4647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
4648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (d1 < d2)
4649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
4650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (d1 > d2)
4651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
4652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (d1 == d2)
4653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
4654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(2);
4655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCompareValues:
4659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @x:  a first value
4660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @xvalue: the first value as a string (optional)
4661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @xwtsp: the whitespace type
4662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @y:  a second value
4663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @xvalue: the second value as a string (optional)
4664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ywtsp: the whitespace type
4665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare 2 values
4667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, 3 if not
4669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * comparable and -2 in case of error
4670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
4672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCompareValuesInternal(xmlSchemaValType xtype,
4673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlSchemaValPtr x,
4674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       const xmlChar *xvalue,
4675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlSchemaWhitespaceValueType xws,
4676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlSchemaValType ytype,
4677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlSchemaValPtr y,
4678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       const xmlChar *yvalue,
4679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlSchemaWhitespaceValueType yws)
4680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (xtype) {
4682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_UNKNOWN:
4683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_ANYTYPE:
4684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-2);
4685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_INTEGER:
4686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_NPINTEGER:
4687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_NINTEGER:
4688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_NNINTEGER:
4689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_PINTEGER:
4690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_INT:
4691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_UINT:
4692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_LONG:
4693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_ULONG:
4694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_SHORT:
4695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_USHORT:
4696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_BYTE:
4697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_UBYTE:
4698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_DECIMAL:
4699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((x == NULL) || (y == NULL))
4700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-2);
4701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ytype == xtype)
4702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(xmlSchemaCompareDecimals(x, y));
4703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((ytype == XML_SCHEMAS_DECIMAL) ||
4704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(ytype == XML_SCHEMAS_INTEGER) ||
4705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(ytype == XML_SCHEMAS_NPINTEGER) ||
4706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(ytype == XML_SCHEMAS_NINTEGER) ||
4707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(ytype == XML_SCHEMAS_NNINTEGER) ||
4708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(ytype == XML_SCHEMAS_PINTEGER) ||
4709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(ytype == XML_SCHEMAS_INT) ||
4710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(ytype == XML_SCHEMAS_UINT) ||
4711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(ytype == XML_SCHEMAS_LONG) ||
4712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(ytype == XML_SCHEMAS_ULONG) ||
4713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(ytype == XML_SCHEMAS_SHORT) ||
4714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(ytype == XML_SCHEMAS_USHORT) ||
4715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(ytype == XML_SCHEMAS_BYTE) ||
4716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(ytype == XML_SCHEMAS_UBYTE))
4717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(xmlSchemaCompareDecimals(x, y));
4718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-2);
4719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_DURATION:
4720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((x == NULL) || (y == NULL))
4721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-2);
4722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ytype == XML_SCHEMAS_DURATION)
4723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return(xmlSchemaCompareDurations(x, y));
4724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return(-2);
4725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_TIME:
4726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_GDAY:
4727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_GMONTH:
4728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_GMONTHDAY:
4729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_GYEAR:
4730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_GYEARMONTH:
4731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_DATE:
4732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_DATETIME:
4733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((x == NULL) || (y == NULL))
4734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-2);
4735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((ytype == XML_SCHEMAS_DATETIME)  ||
4736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (ytype == XML_SCHEMAS_TIME)      ||
4737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (ytype == XML_SCHEMAS_GDAY)      ||
4738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (ytype == XML_SCHEMAS_GMONTH)    ||
4739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (ytype == XML_SCHEMAS_GMONTHDAY) ||
4740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (ytype == XML_SCHEMAS_GYEAR)     ||
4741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (ytype == XML_SCHEMAS_DATE)      ||
4742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (ytype == XML_SCHEMAS_GYEARMONTH))
4743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (xmlSchemaCompareDates(x, y));
4744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (-2);
474594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	/*
4746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Note that we will support comparison of string types against
4747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* anySimpleType as well.
4748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
4749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_ANYSIMPLETYPE:
4750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_STRING:
475194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun        case XML_SCHEMAS_NORMSTRING:
4752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_TOKEN:
4753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_LANGUAGE:
4754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_NMTOKEN:
4755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_NAME:
4756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_NCNAME:
4757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_ID:
4758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_IDREF:
4759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_ENTITY:
4760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_ANYURI:
4761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
4762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    const xmlChar *xv, *yv;
4763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (x == NULL)
4765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xv = xvalue;
4766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
4767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xv = x->value.str;
4768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (y == NULL)
4769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		yv = yvalue;
4770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
4771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		yv = y->value.str;
4772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
4773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: Compare those against QName.
4774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
477594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    if (ytype == XML_SCHEMAS_QNAME) {
4776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		TODO
4777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (y == NULL)
477894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		    return(-2);
4779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (-2);
4780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
4781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((ytype == XML_SCHEMAS_ANYSIMPLETYPE) ||
4782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(ytype == XML_SCHEMAS_STRING) ||
4783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(ytype == XML_SCHEMAS_NORMSTRING) ||
4784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (ytype == XML_SCHEMAS_TOKEN) ||
4785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (ytype == XML_SCHEMAS_LANGUAGE) ||
4786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (ytype == XML_SCHEMAS_NMTOKEN) ||
4787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (ytype == XML_SCHEMAS_NAME) ||
4788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (ytype == XML_SCHEMAS_NCNAME) ||
4789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (ytype == XML_SCHEMAS_ID) ||
4790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (ytype == XML_SCHEMAS_IDREF) ||
4791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (ytype == XML_SCHEMAS_ENTITY) ||
4792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (ytype == XML_SCHEMAS_ANYURI)) {
4793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xws == XML_SCHEMA_WHITESPACE_PRESERVE) {
4795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) {
4797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/* TODO: What about x < y or x > y. */
4798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (xmlStrEqual(xv, yv))
4799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    return (0);
480094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun			else
4801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    return (2);
4802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if (yws == XML_SCHEMA_WHITESPACE_REPLACE)
4803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return (xmlSchemaComparePreserveReplaceStrings(xv, yv, 0));
4804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE)
4805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return (xmlSchemaComparePreserveCollapseStrings(xv, yv, 0));
4806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (xws == XML_SCHEMA_WHITESPACE_REPLACE) {
4808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (yws == XML_SCHEMA_WHITESPACE_PRESERVE)
4810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return (xmlSchemaComparePreserveReplaceStrings(yv, xv, 1));
4811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (yws == XML_SCHEMA_WHITESPACE_REPLACE)
4812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return (xmlSchemaCompareReplacedStrings(xv, yv));
4813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE)
4814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return (xmlSchemaCompareReplaceCollapseStrings(xv, yv, 0));
4815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (xws == XML_SCHEMA_WHITESPACE_COLLAPSE) {
4817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (yws == XML_SCHEMA_WHITESPACE_PRESERVE)
4819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return (xmlSchemaComparePreserveCollapseStrings(yv, xv, 1));
4820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (yws == XML_SCHEMA_WHITESPACE_REPLACE)
4821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return (xmlSchemaCompareReplaceCollapseStrings(yv, xv, 1));
4822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE)
4823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return (xmlSchemaCompareNormStrings(xv, yv));
4824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else
4825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (-2);
482694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
4827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
4828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (-2);
4829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_QNAME:
4831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_NOTATION:
4832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((x == NULL) || (y == NULL))
4833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-2);
4834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((ytype == XML_SCHEMAS_QNAME) ||
4835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(ytype == XML_SCHEMAS_NOTATION)) {
4836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((xmlStrEqual(x->value.qname.name, y->value.qname.name)) &&
4837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlStrEqual(x->value.qname.uri, y->value.qname.uri)))
4838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(0);
4839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(2);
4840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
4841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-2);
4842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_FLOAT:
4843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_DOUBLE:
4844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((x == NULL) || (y == NULL))
4845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-2);
4846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((ytype == XML_SCHEMAS_FLOAT) ||
4847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (ytype == XML_SCHEMAS_DOUBLE))
4848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (xmlSchemaCompareFloats(x, y));
4849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (-2);
4850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_BOOLEAN:
4851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((x == NULL) || (y == NULL))
4852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-2);
4853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ytype == XML_SCHEMAS_BOOLEAN) {
4854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (x->value.b == y->value.b)
4855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(0);
4856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (x->value.b == 0)
4857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(-1);
4858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(1);
4859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
4860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-2);
4861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_HEXBINARY:
4862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((x == NULL) || (y == NULL))
4863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-2);
4864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ytype == XML_SCHEMAS_HEXBINARY) {
4865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        if (x->value.hex.total == y->value.hex.total) {
4866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    int ret = xmlStrcmp(x->value.hex.str, y->value.hex.str);
4867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ret > 0)
4868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(1);
4869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else if (ret == 0)
4870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(0);
4871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
4872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else if (x->value.hex.total > y->value.hex.total)
4873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(1);
4874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
4876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (-2);
4878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_BASE64BINARY:
4879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((x == NULL) || (y == NULL))
4880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-2);
4881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ytype == XML_SCHEMAS_BASE64BINARY) {
4882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (x->value.base64.total == y->value.base64.total) {
4883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    int ret = xmlStrcmp(x->value.base64.str,
4884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		                        y->value.base64.str);
4885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ret > 0)
4886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        return(1);
4887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    else if (ret == 0)
4888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        return(0);
4889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
4890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        return(-1);
4891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
4892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                else if (x->value.base64.total > y->value.base64.total)
4893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    return(1);
4894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                else
4895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    return(-1);
4896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
489794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun            return (-2);
4898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_IDREFS:
4899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_ENTITIES:
4900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_NMTOKENS:
4901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    TODO
4902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
4903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return -2;
4905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCompareValues:
4909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @x:  a first value
4910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @y:  a second value
4911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare 2 values
4913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
4915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * case of error
4916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
4918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCompareValues(xmlSchemaValPtr x, xmlSchemaValPtr y) {
4919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaWhitespaceValueType xws, yws;
4920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((x == NULL) || (y == NULL))
4922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-2);
4923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (x->type == XML_SCHEMAS_STRING)
4924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xws = XML_SCHEMA_WHITESPACE_PRESERVE;
4925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (x->type == XML_SCHEMAS_NORMSTRING)
4926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xws = XML_SCHEMA_WHITESPACE_REPLACE;
4927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
4928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xws = XML_SCHEMA_WHITESPACE_COLLAPSE;
4929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (y->type == XML_SCHEMAS_STRING)
4931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	yws = XML_SCHEMA_WHITESPACE_PRESERVE;
4932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (x->type == XML_SCHEMAS_NORMSTRING)
4933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        yws = XML_SCHEMA_WHITESPACE_REPLACE;
4934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
4935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        yws = XML_SCHEMA_WHITESPACE_COLLAPSE;
4936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlSchemaCompareValuesInternal(x->type, x, NULL, xws, y->type,
4938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	y, NULL, yws));
4939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCompareValuesWhtsp:
4943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @x:  a first value
4944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @xws: the whitespace value of x
4945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @y:  a second value
4946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @yws: the whitespace value of y
4947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare 2 values
4949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
4951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * case of error
4952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
4954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCompareValuesWhtsp(xmlSchemaValPtr x,
4955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaWhitespaceValueType xws,
4956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaValPtr y,
4957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaWhitespaceValueType yws)
4958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((x == NULL) || (y == NULL))
4960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-2);
4961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlSchemaCompareValuesInternal(x->type, x, NULL, xws, y->type,
4962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	y, NULL, yws));
4963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCompareValuesWhtspExt:
4967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @x:  a first value
4968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @xws: the whitespace value of x
4969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @y:  a second value
4970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @yws: the whitespace value of y
4971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare 2 values
4973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
4975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * case of error
4976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
4978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCompareValuesWhtspExt(xmlSchemaValType xtype,
4979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlSchemaValPtr x,
4980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       const xmlChar *xvalue,
4981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlSchemaWhitespaceValueType xws,
4982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlSchemaValType ytype,
4983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlSchemaValPtr y,
4984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       const xmlChar *yvalue,
4985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlSchemaWhitespaceValueType yws)
4986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlSchemaCompareValuesInternal(xtype, x, xvalue, xws, ytype, y,
4988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	yvalue, yws));
4989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaNormLen:
4993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  a string
4994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Computes the UTF8 length of the normalized value of the string
4996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the length or -1 in case of error.
4998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
5000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaNormLen(const xmlChar *value) {
5001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *utf;
5002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
5003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (value == NULL)
5005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
5006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    utf = value;
5007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (IS_BLANK_CH(*utf)) utf++;
5008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (*utf != 0) {
5009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (utf[0] & 0x80) {
5010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((utf[1] & 0xc0) != 0x80)
5011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
5012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((utf[0] & 0xe0) == 0xe0) {
5013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((utf[2] & 0xc0) != 0x80)
5014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(-1);
5015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((utf[0] & 0xf0) == 0xf0) {
5016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((utf[0] & 0xf8) != 0xf0 || (utf[3] & 0xc0) != 0x80)
5017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(-1);
5018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    utf += 4;
5019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
5020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    utf += 3;
5021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
5022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
5023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		utf += 2;
5024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
5025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (IS_BLANK_CH(*utf)) {
5026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (IS_BLANK_CH(*utf)) utf++;
5027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (*utf == 0)
5028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
5029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
5030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    utf++;
5031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret++;
5033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetFacetValueAsULong:
5039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @facet: an schemas type facet
5040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extract the value of a facet
5042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the value as a long
5044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectunsigned long
5046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetFacetValueAsULong(xmlSchemaFacetPtr facet)
5047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
5049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Check if this is a decimal.
5050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
5051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (facet == NULL)
5052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return 0;
5053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return ((unsigned long) facet->val->value.decimal.lo);
5054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaValidateListSimpleTypeFacet:
5058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @facet:  the facet to check
5059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the lexical repr of the value to validate
5060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @actualLen:  the number of list items
5061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @expectedLen: the resulting expected number of list items
5062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks the value of a list simple type against a facet.
5064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the value is valid, a positive error code
5066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number otherwise and -1 in case of an internal error.
5067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
5069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidateListSimpleTypeFacet(xmlSchemaFacetPtr facet,
5070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				     const xmlChar *value,
5071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				     unsigned long actualLen,
5072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				     unsigned long *expectedLen)
5073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (facet == NULL)
5075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
5076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
5077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Check if this will work with large numbers.
5078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * (compare value.decimal.mi and value.decimal.hi as well?).
5079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
5080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (facet->type == XML_SCHEMA_FACET_LENGTH) {
5081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (actualLen != facet->val->value.decimal.lo) {
5082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (expectedLen != NULL)
5083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*expectedLen = facet->val->value.decimal.lo;
5084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (XML_SCHEMAV_CVC_LENGTH_VALID);
508594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	}
5086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) {
5087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (actualLen < facet->val->value.decimal.lo) {
5088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (expectedLen != NULL)
5089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*expectedLen = facet->val->value.decimal.lo;
5090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (XML_SCHEMAV_CVC_MINLENGTH_VALID);
5091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (facet->type == XML_SCHEMA_FACET_MAXLENGTH) {
5093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (actualLen > facet->val->value.decimal.lo) {
5094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (expectedLen != NULL)
5095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*expectedLen = facet->val->value.decimal.lo;
5096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (XML_SCHEMAV_CVC_MAXLENGTH_VALID);
5097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else
509994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	/*
510094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	* NOTE: That we can pass NULL as xmlSchemaValPtr to
5101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* xmlSchemaValidateFacet, since the remaining facet types
510294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	* are: XML_SCHEMA_FACET_PATTERN, XML_SCHEMA_FACET_ENUMERATION.
5103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
510494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	return(xmlSchemaValidateFacet(NULL, facet, value, NULL));
5105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
5106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaValidateLengthFacet:
5110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the built-in type
5111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @facet:  the facet to check
5112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the lexical repr. of the value to be validated
5113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the precomputed value
5114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ws: the whitespace type of the value
5115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @length: the actual length of the value
5116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
511794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Checka a value against a "length", "minLength" and "maxLength"
5118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * facet; sets @length to the computed length of @value.
5119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the value is valid, a positive error code
5121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * otherwise and -1 in case of an internal or API error.
5122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
5124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidateLengthFacetInternal(xmlSchemaFacetPtr facet,
512594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun				     xmlSchemaValType valType,
5126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				     const xmlChar *value,
512794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun				     xmlSchemaValPtr val,
5128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				     unsigned long *length,
512994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun				     xmlSchemaWhitespaceValueType ws)
5130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned int len = 0;
5132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((length == NULL) || (facet == NULL))
5134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
5135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *length = 0;
5136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((facet->type != XML_SCHEMA_FACET_LENGTH) &&
5137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(facet->type != XML_SCHEMA_FACET_MAXLENGTH) &&
5138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(facet->type != XML_SCHEMA_FACET_MINLENGTH))
5139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
514094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
5141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
5142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: length, maxLength and minLength must be of type
5143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * nonNegativeInteger only. Check if decimal is used somehow.
5144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
5145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((facet->val == NULL) ||
5146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((facet->val->type != XML_SCHEMAS_DECIMAL) &&
5147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 (facet->val->type != XML_SCHEMAS_NNINTEGER)) ||
5148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(facet->val->value.decimal.frac != 0)) {
5149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
5150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY))
5152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	len = val->value.hex.total;
5153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY))
5154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	len = val->value.base64.total;
5155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else {
5156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (valType) {
5157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_STRING:
5158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_NORMSTRING:
5159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) {
5160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
5161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * This is to ensure API compatibility with the old
5162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * xmlSchemaValidateLengthFacet(). Anyway, this was and
5163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * is not the correct handling.
5164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * TODO: Get rid of this case somehow.
5165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
5166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (valType == XML_SCHEMAS_STRING)
5167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			len = xmlUTF8Strlen(value);
5168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
5169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			len = xmlSchemaNormLen(value);
5170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (value != NULL) {
5171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
5172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			len = xmlSchemaNormLen(value);
5173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
517494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		    /*
5175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Should be OK for "preserve" as well.
5176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
5177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    len = xmlUTF8Strlen(value);
5178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
5179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
5180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_IDREF:
5181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_TOKEN:
5182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_LANGUAGE:
5183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_NMTOKEN:
5184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_NAME:
5185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_NCNAME:
518694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    case XML_SCHEMAS_ID:
5187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
5188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* FIXME: What exactly to do with anyURI?
5189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
5190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_ANYURI:
5191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (value != NULL)
5192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    len = xmlSchemaNormLen(value);
5193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
5194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_QNAME:
519594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    case XML_SCHEMAS_NOTATION:
519694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		/*
5197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* For QName and NOTATION, those facets are
5198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* deprecated and should be ignored.
519994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		*/
5200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (0);
5201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
5202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		TODO
5203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *length = (unsigned long) len;
5206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
5207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Return the whole expected value, i.e. "lo", "mi" and "hi".
5208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
5209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (facet->type == XML_SCHEMA_FACET_LENGTH) {
5210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (len != facet->val->value.decimal.lo)
5211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(XML_SCHEMAV_CVC_LENGTH_VALID);
5212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) {
5213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (len < facet->val->value.decimal.lo)
5214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(XML_SCHEMAV_CVC_MINLENGTH_VALID);
5215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
5216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (len > facet->val->value.decimal.lo)
5217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(XML_SCHEMAV_CVC_MAXLENGTH_VALID);
5218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
521994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
5220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
5221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaValidateLengthFacet:
5225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the built-in type
5226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @facet:  the facet to check
5227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the lexical repr. of the value to be validated
5228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the precomputed value
5229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @length: the actual length of the value
5230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
523194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Checka a value against a "length", "minLength" and "maxLength"
5232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * facet; sets @length to the computed length of @value.
5233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the value is valid, a positive error code
5235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * otherwise and -1 in case of an internal or API error.
5236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
523894442ad4107000e6d49f9b85a46a591495a57632Selim GurunxmlSchemaValidateLengthFacet(xmlSchemaTypePtr type,
5239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaFacetPtr facet,
5240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     const xmlChar *value,
5241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaValPtr val,
524294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun			     unsigned long *length)
5243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type == NULL)
5245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
5246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (xmlSchemaValidateLengthFacetInternal(facet,
5247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->builtInType, value, val, length,
5248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XML_SCHEMA_WHITESPACE_UNKNOWN));
5249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
525294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * xmlSchemaValidateLengthFacetWhtsp:
5253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @facet:  the facet to check
5254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @valType:  the built-in type
5255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the lexical repr. of the value to be validated
5256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the precomputed value
5257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ws: the whitespace type of the value
5258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @length: the actual length of the value
5259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
526094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Checka a value against a "length", "minLength" and "maxLength"
5261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * facet; sets @length to the computed length of @value.
5262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the value is valid, a positive error code
5264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * otherwise and -1 in case of an internal or API error.
5265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
5267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidateLengthFacetWhtsp(xmlSchemaFacetPtr facet,
5268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  xmlSchemaValType valType,
5269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  const xmlChar *value,
5270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  xmlSchemaValPtr val,
5271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  unsigned long *length,
5272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  xmlSchemaWhitespaceValueType ws)
5273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (xmlSchemaValidateLengthFacetInternal(facet, valType, value, val,
5275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	length, ws));
5276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaValidateFacetInternal:
5280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @facet:  the facet to check
5281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @fws: the whitespace type of the facet's value
5282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @valType: the built-in type of the value
5283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the lexical repr of the value to validate
5284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the precomputed value
5285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ws: the whitespace type of the value
5286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check a value against a facet condition
5288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the element is schemas valid, a positive error code
5290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     number otherwise and -1 in case of internal or API error.
5291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
5293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidateFacetInternal(xmlSchemaFacetPtr facet,
5294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlSchemaWhitespaceValueType fws,
529594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun			       xmlSchemaValType valType,
5296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       const xmlChar *value,
5297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlSchemaValPtr val,
5298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlSchemaWhitespaceValueType ws)
5299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
5301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (facet == NULL)
5303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
5304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (facet->type) {
5306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_PATTERN:
530794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    /*
5308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * NOTE that for patterns, the @value needs to be the normalized
5309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * value, *not* the lexical initial value or the canonical value.
5310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
5311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (value == NULL)
5312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
5313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlRegexpExec(facet->regexp, value);
5314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret == 1)
5315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
5316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret == 0)
5317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(XML_SCHEMAV_CVC_PATTERN_VALID);
5318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
5319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_MAXEXCLUSIVE:
5320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaCompareValues(val, facet->val);
5321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret == -2)
5322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
5323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret == -1)
5324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
5325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID);
5326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_MAXINCLUSIVE:
5327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaCompareValues(val, facet->val);
5328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret == -2)
5329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
5330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((ret == -1) || (ret == 0))
5331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
5332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID);
5333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_MINEXCLUSIVE:
5334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaCompareValues(val, facet->val);
5335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret == -2)
5336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
5337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret == 1)
5338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
5339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID);
5340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_MININCLUSIVE:
5341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaCompareValues(val, facet->val);
5342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret == -2)
5343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
5344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((ret == 1) || (ret == 0))
5345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
5346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(XML_SCHEMAV_CVC_MININCLUSIVE_VALID);
5347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_WHITESPACE:
5348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* TODO whitespaces */
5349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
5350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * NOTE: Whitespace should be handled to normalize
5351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * the value to be validated against a the facets;
5352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * not to normalize the value in-between.
5353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
5354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
5355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case  XML_SCHEMA_FACET_ENUMERATION:
5356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) {
5357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
5358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* This is to ensure API compatibility with the old
5359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* xmlSchemaValidateFacet().
5360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* TODO: Get rid of this case.
5361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
5362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((facet->value != NULL) &&
5363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlStrEqual(facet->value, value)))
5364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(0);
5365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
5366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlSchemaCompareValuesWhtspExt(facet->val->type,
5367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    facet->val, facet->value, fws, valType, val,
5368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    value, ws);
5369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret == -2)
5370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(-1);
5371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret == 0)
5372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(0);
5373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
5374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(XML_SCHEMAV_CVC_ENUMERATION_VALID);
5375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_LENGTH:
5376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
5377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (1.3) "if {primitive type definition} is QName or NOTATION,
5378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * then any {value} is facet-valid."
5379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
5380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((valType == XML_SCHEMAS_QNAME) ||
5381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(valType == XML_SCHEMAS_NOTATION))
5382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (0);
5383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* No break on purpose. */
5384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_MAXLENGTH:
5385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_MINLENGTH: {
5386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    unsigned int len = 0;
5387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((valType == XML_SCHEMAS_QNAME) ||
5389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(valType == XML_SCHEMAS_NOTATION))
5390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (0);
5391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
5392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: length, maxLength and minLength must be of type
5393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * nonNegativeInteger only. Check if decimal is used somehow.
5394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
5395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((facet->val == NULL) ||
5396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((facet->val->type != XML_SCHEMAS_DECIMAL) &&
5397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (facet->val->type != XML_SCHEMAS_NNINTEGER)) ||
5398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(facet->val->value.decimal.frac != 0)) {
5399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
5400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
5401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY))
5402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		len = val->value.hex.total;
5403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY))
5404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		len = val->value.base64.total;
5405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else {
5406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		switch (valType) {
5407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_SCHEMAS_STRING:
540894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		    case XML_SCHEMAS_NORMSTRING:
5409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) {
5410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /*
5411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * This is to ensure API compatibility with the old
5412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * xmlSchemaValidateFacet(). Anyway, this was and
5413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * is not the correct handling.
5414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * TODO: Get rid of this case somehow.
5415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    */
5416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (valType == XML_SCHEMAS_STRING)
5417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				len = xmlUTF8Strlen(value);
5418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    else
5419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				len = xmlSchemaNormLen(value);
5420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else if (value != NULL) {
5421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
5422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				len = xmlSchemaNormLen(value);
5423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    else
542494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun				/*
5425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				* Should be OK for "preserve" as well.
5426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				*/
5427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				len = xmlUTF8Strlen(value);
5428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
5429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
543094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		    case XML_SCHEMAS_IDREF:
5431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_SCHEMAS_TOKEN:
5432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_SCHEMAS_LANGUAGE:
5433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_SCHEMAS_NMTOKEN:
5434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_SCHEMAS_NAME:
5435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_SCHEMAS_NCNAME:
5436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_SCHEMAS_ID:
5437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_SCHEMAS_ANYURI:
5438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (value != NULL)
543994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun			    len = xmlSchemaNormLen(value);
544094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun			break;
5441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    default:
5442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        TODO
544394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		}
5444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
5445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (facet->type == XML_SCHEMA_FACET_LENGTH) {
5446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (len != facet->val->value.decimal.lo)
5447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(XML_SCHEMAV_CVC_LENGTH_VALID);
5448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) {
5449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (len < facet->val->value.decimal.lo)
5450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(XML_SCHEMAV_CVC_MINLENGTH_VALID);
5451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
5452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (len > facet->val->value.decimal.lo)
5453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(XML_SCHEMAV_CVC_MAXLENGTH_VALID);
5454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
5455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_TOTALDIGITS:
5458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_FRACTIONDIGITS:
5459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((facet->val == NULL) ||
5461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((facet->val->type != XML_SCHEMAS_PINTEGER) &&
5462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (facet->val->type != XML_SCHEMAS_NNINTEGER)) ||
5463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(facet->val->value.decimal.frac != 0)) {
5464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
5465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
5466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((val == NULL) ||
5467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((val->type != XML_SCHEMAS_DECIMAL) &&
5468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (val->type != XML_SCHEMAS_INTEGER) &&
5469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (val->type != XML_SCHEMAS_NPINTEGER) &&
5470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (val->type != XML_SCHEMAS_NINTEGER) &&
5471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (val->type != XML_SCHEMAS_NNINTEGER) &&
5472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (val->type != XML_SCHEMAS_PINTEGER) &&
5473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (val->type != XML_SCHEMAS_INT) &&
5474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (val->type != XML_SCHEMAS_UINT) &&
5475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (val->type != XML_SCHEMAS_LONG) &&
5476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (val->type != XML_SCHEMAS_ULONG) &&
5477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (val->type != XML_SCHEMAS_SHORT) &&
5478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (val->type != XML_SCHEMAS_USHORT) &&
5479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (val->type != XML_SCHEMAS_BYTE) &&
5480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (val->type != XML_SCHEMAS_UBYTE))) {
5481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
5482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
5483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (facet->type == XML_SCHEMA_FACET_TOTALDIGITS) {
5484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        if (val->value.decimal.total > facet->val->value.decimal.lo)
5485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	            return(XML_SCHEMAV_CVC_TOTALDIGITS_VALID);
5486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (facet->type == XML_SCHEMA_FACET_FRACTIONDIGITS) {
5488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        if (val->value.decimal.frac > facet->val->value.decimal.lo)
5489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID);
5490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
5491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
5493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    TODO
5494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
5496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaValidateFacet:
5501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @base:  the base type
5502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @facet:  the facet to check
5503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the lexical repr of the value to validate
5504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the precomputed value
5505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check a value against a facet condition
5507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the element is schemas valid, a positive error code
5509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     number otherwise and -1 in case of internal or API error.
5510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
5512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidateFacet(xmlSchemaTypePtr base,
5513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	               xmlSchemaFacetPtr facet,
5514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	               const xmlChar *value,
5515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlSchemaValPtr val)
5516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
5518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * This tries to ensure API compatibility regarding the old
5519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * xmlSchemaValidateFacet() and the new xmlSchemaValidateFacetInternal() and
5520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * xmlSchemaValidateFacetWhtsp().
5521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
5522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val != NULL)
5523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlSchemaValidateFacetInternal(facet,
5524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_WHITESPACE_UNKNOWN, val->type, value, val,
5525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_WHITESPACE_UNKNOWN));
5526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (base != NULL)
5527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlSchemaValidateFacetInternal(facet,
5528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_WHITESPACE_UNKNOWN, base->builtInType, value, val,
5529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_WHITESPACE_UNKNOWN));
5530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(-1);
5531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaValidateFacetWhtsp:
5535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @facet:  the facet to check
5536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @fws: the whitespace type of the facet's value
5537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @valType: the built-in type of the value
5538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the lexical (or normalized for pattern) repr of the value to validate
5539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the precomputed value
5540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ws: the whitespace type of the value
5541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check a value against a facet condition. This takes value normalization
5543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * according to the specified whitespace types into account.
5544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note that @value needs to be the *normalized* value if the facet
5545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is of type "pattern".
5546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the element is schemas valid, a positive error code
5548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     number otherwise and -1 in case of internal or API error.
5549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
5551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidateFacetWhtsp(xmlSchemaFacetPtr facet,
5552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaWhitespaceValueType fws,
555394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun			    xmlSchemaValType valType,
5554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    const xmlChar *value,
5555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaValPtr val,
5556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaWhitespaceValueType ws)
5557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     return(xmlSchemaValidateFacetInternal(facet, fws, valType,
5559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 value, val, ws));
5560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
5563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef DBL_DIG
5564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DBL_DIG 16
5565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef DBL_EPSILON
5567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DBL_EPSILON 1E-9
5568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define INTEGER_DIGITS DBL_DIG
5571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define FRACTION_DIGITS (DBL_DIG + 1)
5572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define EXPONENT_DIGITS (3 + 2)
5573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFormatNumber:
5576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @number:     number to format
5577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buffer:     output buffer
5578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buffersize: size of output buffer
5579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Convert the number into a string representation.
5581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
5583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFormatFloat(double number, char buffer[], int buffersize)
5584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (xmlXPathIsInf(number)) {
5586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case 1:
5587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (buffersize > (int)sizeof("INF"))
5588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    snprintf(buffer, buffersize, "INF");
5589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    case -1:
5591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (buffersize > (int)sizeof("-INF"))
5592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    snprintf(buffer, buffersize, "-INF");
5593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    default:
5595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlXPathIsNaN(number)) {
5596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (buffersize > (int)sizeof("NaN"))
5597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		snprintf(buffer, buffersize, "NaN");
5598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (number == 0) {
5599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    snprintf(buffer, buffersize, "0.0E0");
5600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
5601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* 3 is sign, decimal point, and terminating zero */
5602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    char work[DBL_DIG + EXPONENT_DIGITS + 3];
5603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int integer_place, fraction_place;
5604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    char *ptr;
5605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    char *after_fraction;
5606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    double absolute_value;
5607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int size;
5608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    absolute_value = fabs(number);
5610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
5612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * Result is in work, and after_fraction points
5613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * just past the fractional part.
561494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	     * Use scientific notation
5615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
5616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    integer_place = DBL_DIG + EXPONENT_DIGITS + 1;
5617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fraction_place = DBL_DIG - 1;
5618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    snprintf(work, sizeof(work),"%*.*e",
5619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		integer_place, fraction_place, number);
562094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    after_fraction = strchr(work + DBL_DIG, 'e');
5621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Remove fractional trailing zeroes */
5622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ptr = after_fraction;
5623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (*(--ptr) == '0')
5624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		;
5625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (*ptr != '.')
5626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ptr++;
5627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while ((*ptr++ = *after_fraction++) != 0);
5628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Finally copy result back to caller */
5630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    size = strlen(work) + 1;
5631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (size > buffersize) {
5632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		work[buffersize - 1] = 0;
5633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		size = buffersize;
5634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
5635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    memmove(buffer, work, size);
5636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
5638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetCanonValue:
5644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the precomputed value
5645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @retValue: the returned value
5646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get a the cononical lexical representation of the value.
5648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The caller has to FREE the returned retValue.
5649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * WARNING: Some value types are not supported yet, resulting
5651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in a @retValue of "???".
565294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *
5653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: XML Schema 1.0 does not define canonical representations
5654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * for: duration, gYearMonth, gYear, gMonthDay, gMonth, gDay,
5655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * anyURI, QName, NOTATION. This will be fixed in XML Schema 1.1.
5656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the value could be built, 1 if the value type is
5659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * not supported yet and -1 in case of API errors.
5660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
5662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetCanonValue(xmlSchemaValPtr val, const xmlChar **retValue)
5663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((retValue == NULL) || (val == NULL))
5665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
5666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *retValue = NULL;
5667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (val->type) {
5668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_STRING:
5669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (val->value.str == NULL)
5670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*retValue = BAD_CAST xmlStrdup(BAD_CAST "");
5671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
567294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		*retValue =
5673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    BAD_CAST xmlStrdup((const xmlChar *) val->value.str);
5674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_NORMSTRING:
5676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (val->value.str == NULL)
5677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*retValue = BAD_CAST xmlStrdup(BAD_CAST "");
5678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else {
5679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*retValue = xmlSchemaWhiteSpaceReplace(
5680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (const xmlChar *) val->value.str);
5681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((*retValue) == NULL)
5682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *retValue = BAD_CAST xmlStrdup(
5683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(const xmlChar *) val->value.str);
5684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
5685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_TOKEN:
5687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_LANGUAGE:
5688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_NMTOKEN:
568994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	case XML_SCHEMAS_NAME:
5690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_NCNAME:
5691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_ID:
5692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_IDREF:
5693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_ENTITY:
5694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_NOTATION: /* Unclear */
5695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_ANYURI:   /* Unclear */
5696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (val->value.str == NULL)
5697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (-1);
569894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    *retValue =
5699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		BAD_CAST xmlSchemaCollapseString(BAD_CAST val->value.str);
5700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (*retValue == NULL)
570194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		*retValue =
5702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    BAD_CAST xmlStrdup((const xmlChar *) val->value.str);
5703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_QNAME:
5705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* TODO: Unclear in XML Schema 1.0. */
5706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (val->value.qname.uri == NULL) {
5707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.qname.name);
5708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (0);
5709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
5710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*retValue = BAD_CAST xmlStrdup(BAD_CAST "{");
5711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue),
5712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    BAD_CAST val->value.qname.uri);
5713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue),
5714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    BAD_CAST "}");
5715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue),
5716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    BAD_CAST val->value.qname.uri);
5717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
5718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_DECIMAL:
5720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
5721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: Lookout for a more simple implementation.
5722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
572394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    if ((val->value.decimal.total == 1) &&
5724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(val->value.decimal.lo == 0)) {
5725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*retValue = xmlStrdup(BAD_CAST "0.0");
5726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
5727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaValDecimal dec = val->value.decimal;
5728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int bufsize;
5729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		char *buf = NULL, *offs;
5730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* Add room for the decimal point as well. */
5732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		bufsize = dec.total + 2;
5733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (dec.sign)
5734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    bufsize++;
5735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* Add room for leading/trailing zero. */
5736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((dec.frac == 0) || (dec.frac == dec.total))
5737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    bufsize++;
5738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		buf = xmlMalloc(bufsize);
5739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (buf == NULL)
5740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(-1);
5741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		offs = buf;
5742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (dec.sign)
5743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *offs++ = '-';
5744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (dec.frac == dec.total) {
5745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *offs++ = '0';
5746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *offs++ = '.';
5747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
5748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (dec.hi != 0)
5749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    snprintf(offs, bufsize - (offs - buf),
5750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"%lu%lu%lu", dec.hi, dec.mi, dec.lo);
5751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else if (dec.mi != 0)
5752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    snprintf(offs, bufsize - (offs - buf),
5753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"%lu%lu", dec.mi, dec.lo);
5754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
5755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    snprintf(offs, bufsize - (offs - buf),
5756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"%lu", dec.lo);
575794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
5758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (dec.frac != 0) {
5759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (dec.frac != dec.total) {
5760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			int diff = dec.total - dec.frac;
5761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
5762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* Insert the decimal point.
5763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
5764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			memmove(offs + diff + 1, offs + diff, dec.frac +1);
5765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			offs[diff] = '.';
5766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else {
5767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			unsigned int i = 0;
5768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
5769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* Insert missing zeroes behind the decimal point.
577094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun			*/
5771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			while (*(offs + i) != 0)
5772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    i++;
5773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (i < dec.total) {
5774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    memmove(offs + (dec.total - i), offs, i +1);
5775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    memset(offs, '0', dec.total - i);
5776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
5777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
5778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
5779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
5780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Append decimal point and zero.
5781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
5782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    offs = buf + bufsize - 1;
5783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *offs-- = 0;
5784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *offs-- = '0';
5785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *offs-- = '.';
5786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
5787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*retValue = BAD_CAST buf;
5788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
5789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_INTEGER:
5791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_PINTEGER:
5792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_NPINTEGER:
5793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_NINTEGER:
5794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_NNINTEGER:
5795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_LONG:
5796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_BYTE:
5797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_SHORT:
5798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_INT:
5799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_UINT:
5800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_ULONG:
5801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_USHORT:
5802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_UBYTE:
5803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((val->value.decimal.total == 1) &&
5804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(val->value.decimal.lo == 0))
5805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*retValue = xmlStrdup(BAD_CAST "0");
5806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else {
5807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaValDecimal dec = val->value.decimal;
5808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int bufsize = dec.total + 1;
5809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* Add room for the decimal point as well. */
5811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (dec.sign)
5812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    bufsize++;
5813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*retValue = xmlMalloc(bufsize);
5814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (*retValue == NULL)
5815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(-1);
5816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (dec.hi != 0) {
5817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (dec.sign)
5818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			snprintf((char *) *retValue, bufsize,
5819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "-%lu%lu%lu", dec.hi, dec.mi, dec.lo);
5820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
5821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			snprintf((char *) *retValue, bufsize,
5822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "%lu%lu%lu", dec.hi, dec.mi, dec.lo);
5823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (dec.mi != 0) {
5824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (dec.sign)
5825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			snprintf((char *) *retValue, bufsize,
5826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "-%lu%lu", dec.mi, dec.lo);
5827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
5828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			snprintf((char *) *retValue, bufsize,
5829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "%lu%lu", dec.mi, dec.lo);
5830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
5831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (dec.sign)
5832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			snprintf((char *) *retValue, bufsize, "-%lu", dec.lo);
5833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
5834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			snprintf((char *) *retValue, bufsize, "%lu", dec.lo);
5835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
5836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
5837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_BOOLEAN:
5839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (val->value.b)
5840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*retValue = BAD_CAST xmlStrdup(BAD_CAST "true");
5841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
5842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*retValue = BAD_CAST xmlStrdup(BAD_CAST "false");
5843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_DURATION: {
5845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		char buf[100];
5846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		unsigned long year;
5847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		unsigned long mon, day, hour = 0, min = 0;
5848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		double sec = 0, left;
5849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* TODO: Unclear in XML Schema 1.0 */
5851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
5852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* TODO: This results in a normalized output of the value
5853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* - which is NOT conformant to the spec -
5854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* since the exact values of each property are not
5855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* recoverable. Think about extending the structure to
5856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* provide a field for every property.
5857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
5858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		year = (unsigned long) FQUOTIENT(labs(val->value.dur.mon), 12);
5859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		mon = labs(val->value.dur.mon) - 12 * year;
5860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		day = (unsigned long) FQUOTIENT(fabs(val->value.dur.sec), 86400);
5862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		left = fabs(val->value.dur.sec) - day * 86400;
5863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (left > 0) {
5864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    hour = (unsigned long) FQUOTIENT(left, 3600);
5865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    left = left - (hour * 3600);
5866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (left > 0) {
5867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			min = (unsigned long) FQUOTIENT(left, 60);
5868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			sec = left - (min * 60);
5869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
5870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
5871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((val->value.dur.mon < 0) || (val->value.dur.sec < 0))
5872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    snprintf(buf, 100, "P%luY%luM%luDT%luH%luM%.14gS",
5873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			year, mon, day, hour, min, sec);
5874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
5875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    snprintf(buf, 100, "-P%luY%luM%luDT%luH%luM%.14gS",
5876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			year, mon, day, hour, min, sec);
5877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
5878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
5879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_GYEAR: {
5881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		char buf[30];
5882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* TODO: Unclear in XML Schema 1.0 */
5883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* TODO: What to do with the timezone? */
5884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		snprintf(buf, 30, "%04ld", val->value.date.year);
5885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
5886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
5887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_GMONTH: {
5889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* TODO: Unclear in XML Schema 1.0 */
5890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* TODO: What to do with the timezone? */
5891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*retValue = xmlMalloc(6);
5892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (*retValue == NULL)
5893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(-1);
5894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		snprintf((char *) *retValue, 6, "--%02u",
5895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    val->value.date.mon);
5896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
5897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_GDAY: {
5899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* TODO: Unclear in XML Schema 1.0 */
5900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* TODO: What to do with the timezone? */
5901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*retValue = xmlMalloc(6);
5902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (*retValue == NULL)
5903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(-1);
5904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		snprintf((char *) *retValue, 6, "---%02u",
5905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    val->value.date.day);
5906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
590794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    break;
5908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_GMONTHDAY: {
5909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* TODO: Unclear in XML Schema 1.0 */
5910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* TODO: What to do with the timezone? */
5911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*retValue = xmlMalloc(8);
5912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (*retValue == NULL)
5913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(-1);
5914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		snprintf((char *) *retValue, 8, "--%02u-%02u",
5915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    val->value.date.mon, val->value.date.day);
5916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
5917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_GYEARMONTH: {
5919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		char buf[35];
5920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* TODO: Unclear in XML Schema 1.0 */
5921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* TODO: What to do with the timezone? */
5922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (val->value.date.year < 0)
5923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    snprintf(buf, 35, "-%04ld-%02u",
592494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun			labs(val->value.date.year),
5925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			val->value.date.mon);
5926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
5927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    snprintf(buf, 35, "%04ld-%02u",
5928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			val->value.date.year, val->value.date.mon);
5929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
5930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
593194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    break;
5932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_TIME:
5933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
5934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		char buf[30];
5935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (val->value.date.tz_flag) {
5937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaValPtr norm;
5938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    norm = xmlSchemaDateNormalize(val, 0);
5940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (norm == NULL)
5941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return (-1);
594294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		    /*
594394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		    * TODO: Check if "%.14g" is portable.
5944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
5945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    snprintf(buf, 30,
5946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"%02u:%02u:%02.14gZ",
5947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			norm->value.date.hour,
5948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			norm->value.date.min,
5949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			norm->value.date.sec);
5950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFreeValue(norm);
5951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
5952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    snprintf(buf, 30,
5953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"%02u:%02u:%02.14g",
5954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			val->value.date.hour,
5955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			val->value.date.min,
5956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			val->value.date.sec);
5957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
5958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
595994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    }
5960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_DATE:
5962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
5963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		char buf[30];
5964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (val->value.date.tz_flag) {
5966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaValPtr norm;
5967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    norm = xmlSchemaDateNormalize(val, 0);
5969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (norm == NULL)
5970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return (-1);
5971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
5972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * TODO: Append the canonical value of the
5973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * recoverable timezone and not "Z".
5974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
5975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    snprintf(buf, 30,
5976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"%04ld:%02u:%02uZ",
5977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			norm->value.date.year, norm->value.date.mon,
5978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			norm->value.date.day);
5979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFreeValue(norm);
5980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
5981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    snprintf(buf, 30,
5982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"%04ld:%02u:%02u",
5983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			val->value.date.year, val->value.date.mon,
5984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			val->value.date.day);
5985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
5986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
598794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    }
5988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMAS_DATETIME:
5990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
5991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		char buf[50];
5992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (val->value.date.tz_flag) {
5994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaValPtr norm;
5995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    norm = xmlSchemaDateNormalize(val, 0);
5997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (norm == NULL)
5998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return (-1);
5999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
6000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * TODO: Check if "%.14g" is portable.
6001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
6002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    snprintf(buf, 50,
6003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"%04ld:%02u:%02uT%02u:%02u:%02.14gZ",
6004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			norm->value.date.year, norm->value.date.mon,
6005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			norm->value.date.day, norm->value.date.hour,
6006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			norm->value.date.min, norm->value.date.sec);
6007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFreeValue(norm);
6008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
6009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    snprintf(buf, 50,
6010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"%04ld:%02u:%02uT%02u:%02u:%02.14g",
6011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			val->value.date.year, val->value.date.mon,
6012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			val->value.date.day, val->value.date.hour,
6013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			val->value.date.min, val->value.date.sec);
6014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
6015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
6016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
6018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_HEXBINARY:
6019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.hex.str);
6020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
6021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_BASE64BINARY:
6022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
6023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: Is the following spec piece implemented?:
6024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC: "Note: For some values the canonical form defined
6025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * above does not conform to [RFC 2045], which requires breaking
6026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * with linefeeds at appropriate intervals."
6027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
6028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.base64.str);
6029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
6030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_FLOAT: {
603194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		char buf[30];
603294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		/*
6033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* |m| < 16777216, -149 <= e <= 104.
6034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* TODO: Handle, NaN, INF, -INF. The format is not
6035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* yet conformant. The c type float does not cover
6036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* the whole range.
6037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
6038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		snprintf(buf, 30, "%01.14e", val->value.f);
6039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
6040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
6042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_DOUBLE: {
6043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		char buf[40];
6044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* |m| < 9007199254740992, -1075 <= e <= 970 */
6045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
6046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* TODO: Handle, NaN, INF, -INF. The format is not
6047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* yet conformant. The c type float does not cover
6048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* the whole range.
6049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
6050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		snprintf(buf, 40, "%01.14e", val->value.d);
6051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
6052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
605394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    break;
6054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
6055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *retValue = BAD_CAST xmlStrdup(BAD_CAST "???");
6056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (1);
6057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*retValue == NULL)
6059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
6060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
6061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetCanonValueWhtsp:
6065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the precomputed value
6066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @retValue: the returned value
6067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ws: the whitespace type of the value
6068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get a the cononical representation of the value.
6070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The caller has to free the returned @retValue.
6071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the value could be built, 1 if the value type is
6073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * not supported yet and -1 in case of API errors.
6074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
6076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetCanonValueWhtsp(xmlSchemaValPtr val,
6077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    const xmlChar **retValue,
6078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaWhitespaceValueType ws)
6079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((retValue == NULL) || (val == NULL))
6081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
6082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ws == XML_SCHEMA_WHITESPACE_UNKNOWN) ||
6083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(ws > XML_SCHEMA_WHITESPACE_COLLAPSE))
6084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
6085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *retValue = NULL;
6087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (val->type) {
6088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_STRING:
6089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (val->value.str == NULL)
6090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*retValue = BAD_CAST xmlStrdup(BAD_CAST "");
6091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
6092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*retValue = xmlSchemaCollapseString(val->value.str);
6093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else if (ws == XML_SCHEMA_WHITESPACE_REPLACE)
6094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*retValue = xmlSchemaWhiteSpaceReplace(val->value.str);
6095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((*retValue) == NULL)
6096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*retValue = BAD_CAST xmlStrdup(val->value.str);
6097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
6098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_NORMSTRING:
6099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (val->value.str == NULL)
6100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*retValue = BAD_CAST xmlStrdup(BAD_CAST "");
6101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else {
6102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
6103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *retValue = xmlSchemaCollapseString(val->value.str);
6104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
6105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *retValue = xmlSchemaWhiteSpaceReplace(val->value.str);
6106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((*retValue) == NULL)
6107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *retValue = BAD_CAST xmlStrdup(val->value.str);
6108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
6110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
6111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaGetCanonValue(val, retValue));
611294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    }
6113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
6114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetValType:
6118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: a schemas value
6119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Accessor for the type of a value
6121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlSchemaValType of the value
6123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValType
6125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetValType(xmlSchemaValPtr val)
6126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL)
6128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(XML_SCHEMAS_UNKNOWN);
6129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (val->type);
6130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define bottom_xmlschemastypes
6133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "elfgcchack.h"
6134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_SCHEMAS_ENABLED */
6135