1
0
mirror of https://gitlab.gnome.org/GNOME/libxml2.git synced 2025-08-01 10:06:59 +03:00

started implementing some of the missing default simple types updated the

* xmlschemastypes.c: started implementing some of the missing
  default simple types
* result/relaxng/*: updated the results
Daniel
This commit is contained in:
Daniel Veillard
2003-02-06 08:22:32 +00:00
parent 72fef16e5c
commit 96a4b25245
23 changed files with 319 additions and 55 deletions

View File

@ -18,6 +18,8 @@
#include <libxml/parserInternals.h>
#include <libxml/hash.h>
#include <libxml/valid.h>
#include <libxml/xpath.h>
#include <libxml/uri.h>
#include <libxml/xmlschemas.h>
#include <libxml/schemasInternals.h>
@ -53,6 +55,7 @@ typedef enum {
XML_SCHEMAS_DURATION,
XML_SCHEMAS_FLOAT,
XML_SCHEMAS_DOUBLE,
XML_SCHEMAS_INT,
XML_SCHEMAS_,
XML_SCHEMAS_XXX
} xmlSchemaValType;
@ -129,6 +132,7 @@ static xmlSchemaTypePtr xmlSchemaTypeDurationDef = NULL;
static xmlSchemaTypePtr xmlSchemaTypeNmtoken = NULL;
static xmlSchemaTypePtr xmlSchemaTypeFloatDef = NULL;
static xmlSchemaTypePtr xmlSchemaTypeDoubleDef = NULL;
static xmlSchemaTypePtr xmlSchemaTypeNameDef = NULL;
static xmlSchemaTypePtr xmlSchemaTypeQNameDef = NULL;
static xmlSchemaTypePtr xmlSchemaTypeAnyURIDef = NULL;
@ -205,6 +209,7 @@ xmlSchemaInitTypes(void) {
xmlSchemaTypeNmtoken = xmlSchemaInitBasicType("NMTOKEN");
xmlSchemaTypeFloatDef = xmlSchemaInitBasicType("float");
xmlSchemaTypeDoubleDef = xmlSchemaInitBasicType("double");
xmlSchemaTypeNameDef = xmlSchemaInitBasicType("Name");
xmlSchemaTypeQNameDef = xmlSchemaInitBasicType("QName");
xmlSchemaTypeAnyURIDef = xmlSchemaInitBasicType("anyURI");
@ -965,6 +970,137 @@ error:
return 1;
}
/**
* xmlSchemaValidateNCName:
* @value: the value to check
*
* Check that a value conforms to the lexical space of NCName
*
* Returns 0 if this validates, a positive error code number otherwise
* and -1 in case of internal or API error.
*/
static int
xmlSchemaValidateNCName(const xmlChar *value) {
const xmlChar *cur = value;
/*
* First quick algorithm for ASCII range
*/
while (IS_BLANK(*cur)) cur++;
if (((*cur >= 'a') && (*cur <= 'z')) || ((*cur >= 'A') && (*cur <= 'Z')) ||
(*cur == '_'))
cur++;
else
goto try_complex;
while (((*cur >= 'a') && (*cur <= 'z')) ||
((*cur >= 'A') && (*cur <= 'Z')) ||
((*cur >= '0') && (*cur <= '9')) ||
(*cur == '_') || (*cur == '-') || (*cur == '.'))
cur++;
while (IS_BLANK(*cur)) cur++;
if (*cur == 0)
return(0);
try_complex:
/*
* Second check for chars outside the ASCII range
*/
TODO
return(0);
}
/**
* xmlSchemaValidateQName:
* @value: the value to check
*
* Check that a value conforms to the lexical space of QName
*
* Returns 0 if this validates, a positive error code number otherwise
* and -1 in case of internal or API error.
*/
static int
xmlSchemaValidateQName(const xmlChar *value) {
const xmlChar *cur = value;
/*
* First quick algorithm for ASCII range
*/
while (IS_BLANK(*cur)) cur++;
if (((*cur >= 'a') && (*cur <= 'z')) || ((*cur >= 'A') && (*cur <= 'Z')) ||
(*cur == '_'))
cur++;
else
goto try_complex;
while (((*cur >= 'a') && (*cur <= 'z')) ||
((*cur >= 'A') && (*cur <= 'Z')) ||
((*cur >= '0') && (*cur <= '9')) ||
(*cur == '_') || (*cur == '-') || (*cur == '.'))
cur++;
if (*cur == ':') {
cur++;
if (((*cur >= 'a') && (*cur <= 'z')) ||
((*cur >= 'A') && (*cur <= 'Z')) ||
(*cur == '_'))
cur++;
else
goto try_complex;
while (((*cur >= 'a') && (*cur <= 'z')) ||
((*cur >= 'A') && (*cur <= 'Z')) ||
((*cur >= '0') && (*cur <= '9')) ||
(*cur == '_') || (*cur == '-') || (*cur == '.'))
cur++;
}
while (IS_BLANK(*cur)) cur++;
if (*cur == 0)
return(0);
try_complex:
/*
* Second check for chars outside the ASCII range
*/
TODO
return(0);
}
/**
* xmlSchemaValidateName:
* @value: the value to check
*
* Check that a value conforms to the lexical space of Name
*
* Returns 0 if this validates, a positive error code number otherwise
* and -1 in case of internal or API error.
*/
static int
xmlSchemaValidateName(const xmlChar *value) {
const xmlChar *cur = value;
/*
* First quick algorithm for ASCII range
*/
while (IS_BLANK(*cur)) cur++;
if (((*cur >= 'a') && (*cur <= 'z')) || ((*cur >= 'A') && (*cur <= 'Z')) ||
(*cur == '_') || (*cur == ':'))
cur++;
else
goto try_complex;
while (((*cur >= 'a') && (*cur <= 'z')) ||
((*cur >= 'A') && (*cur <= 'Z')) ||
((*cur >= '0') && (*cur <= '9')) ||
(*cur == '_') || (*cur == '-') || (*cur == '.') || (*cur == ':'))
cur++;
while (IS_BLANK(*cur)) cur++;
if (*cur == 0)
return(0);
try_complex:
/*
* Second check for chars outside the ASCII range
*/
TODO
return(0);
}
/**
* xmlSchemaValidatePredefinedType:
* @type: the predefined type
@ -981,6 +1117,7 @@ int
xmlSchemaValidatePredefinedType(xmlSchemaTypePtr type, const xmlChar *value,
xmlSchemaValPtr *val) {
xmlSchemaValPtr v;
int ret;
if (xmlSchemaTypesInitialized == 0)
return(-1);
@ -1108,42 +1245,195 @@ xmlSchemaValidatePredefinedType(xmlSchemaTypePtr type, const xmlChar *value,
}
}
return(0);
} else if (type == xmlSchemaTypeFloatDef) {
const xmlChar *cur = value, *tmp;
int frac = 0, len, neg = 0;
} else if (type == xmlSchemaTypeIntDef) {
const xmlChar *cur = value;
unsigned long base = 0;
int total = 0;
int sign = 0;
if (cur == NULL)
return(1);
if (*cur == '-') {
sign = 1;
cur++;
} else if (*cur == '+')
cur++;
while (*cur == '0') {
total++;
cur++;
}
while ((*cur >= '0') && (*cur <= '9')) {
base = base * 10 + (*cur - '0');
total++;
cur++;
}
if (*cur != 0)
return(1);
if ((sign == 1) && (total == 0))
return(1);
if (val != NULL) {
v = xmlSchemaNewValue(XML_SCHEMAS_INT);
if (v != NULL) {
v->value.decimal.base = base;
v->value.decimal.sign = sign;
v->value.decimal.frac = 0;
v->value.decimal.total = total;
*val = v;
}
}
return(0);
} else if ((type == xmlSchemaTypeFloatDef) ||
(type == xmlSchemaTypeDoubleDef)) {
const xmlChar *cur = value;
int neg = 0;
if (cur == NULL)
return(1);
if ((cur[0] == 'N') && (cur[1] == 'a') && (cur[2] == 'N')) {
cur += 3;
if (*cur != 0)
return(1);
if (val != NULL) {
if (type == xmlSchemaTypeFloatDef) {
v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
if (v != NULL) {
v->value.f = (float) xmlXPathNAN;
} else {
xmlSchemaFreeValue(v);
return(-1);
}
} else {
v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
if (v != NULL) {
v->value.d = xmlXPathNAN;
} else {
xmlSchemaFreeValue(v);
return(-1);
}
}
*val = v;
}
return(0);
}
if (*cur == '+')
cur++;
else if (*cur == '-') {
neg = 1;
cur++;
}
tmp = cur;
if ((cur[0] == 'I') && (cur[1] == 'N') && (cur[2] == 'F')) {
cur += 3;
if (*cur != 0)
return(1);
if (val != NULL) {
if (type == xmlSchemaTypeFloatDef) {
v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
if (v != NULL) {
if (neg)
v->value.f = (float) xmlXPathNINF;
else
v->value.f = (float) xmlXPathPINF;
} else {
xmlSchemaFreeValue(v);
return(-1);
}
} else {
v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
if (v != NULL) {
if (neg)
v->value.d = xmlXPathNINF;
else
v->value.d = xmlXPathPINF;
} else {
xmlSchemaFreeValue(v);
return(-1);
}
}
*val = v;
}
return(0);
}
while ((*cur >= '0') && (*cur <= '9')) {
base = base * 10 + (*cur - '0');
cur++;
}
len = cur - tmp;
if (*cur == '.') {
cur++;
tmp = cur;
while ((*cur >= '0') && (*cur <= '9')) {
base = base * 10 + (*cur - '0');
while ((*cur >= '0') && (*cur <= '9'))
cur++;
}
frac = cur - tmp;
}
TODO
if ((*cur == 'e') || (*cur == 'E')) {
cur++;
if (*cur == '-')
cur++;
while ((*cur >= '0') && (*cur <= '9'))
cur++;
}
if (*cur != 0)
return(1);
if (val != NULL) {
if (type == xmlSchemaTypeFloatDef) {
v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
if (v != NULL) {
if (sscanf((const char *)value, "%f", &(v->value.f))==1) {
*val = v;
} else {
xmlGenericError(xmlGenericErrorContext,
"failed to scanf float %s\n", value);
xmlSchemaFreeValue(v);
return(1);
}
} else {
return(-1);
}
} else {
v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
if (v != NULL) {
if (sscanf((const char *)value, "%lf", &(v->value.d))==1) {
*val = v;
} else {
xmlGenericError(xmlGenericErrorContext,
"failed to scanf double %s\n", value);
xmlSchemaFreeValue(v);
return(1);
}
} else {
return(-1);
}
}
}
return(0);
} else if (type == xmlSchemaTypeDoubleDef) {
TODO
} else if (type == xmlSchemaTypeNameDef) {
ret = xmlSchemaValidateName(value);
if ((ret == 0) && (val != NULL)) {
TODO;
}
return(ret);
} else if (type == xmlSchemaTypeQNameDef) {
ret = xmlSchemaValidateQName(value);
if ((ret == 0) && (val != NULL)) {
TODO;
}
return(ret);
} else if (type == xmlSchemaTypeNCNameDef) {
ret = xmlSchemaValidateNCName(value);
if ((ret == 0) && (val != NULL)) {
TODO;
}
return(ret);
} else if (type == xmlSchemaTypeAnyURIDef) {
xmlURIPtr uri;
uri = xmlParseURI((const char *) value);
if (uri == NULL)
return(1);
if (val != NULL) {
TODO;
}
xmlFreeURI(uri);
return(0);
} else {
TODO
return(0);
}
return(-1);
}
/**