mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2025-07-29 11:41:22 +03:00
fixed error msg cleanup deallocation added a function to handle lists of
* relaxng.c: fixed error msg cleanup deallocation * xmlschemastypes.c: added a function to handle lists of atomic types, added support for IDREFS Daniel
This commit is contained in:
@ -1,3 +1,9 @@
|
|||||||
|
Tue Mar 18 12:36:22 CET 2003 Daniel Veillard <daniel@veillard.com>
|
||||||
|
|
||||||
|
* relaxng.c: fixed error msg cleanup deallocation
|
||||||
|
* xmlschemastypes.c: added a function to handle lists of
|
||||||
|
atomic types, added support for IDREFS
|
||||||
|
|
||||||
Tue Mar 18 01:28:15 CET 2003 Daniel Veillard <daniel@veillard.com>
|
Tue Mar 18 01:28:15 CET 2003 Daniel Veillard <daniel@veillard.com>
|
||||||
|
|
||||||
* relaxng.c valid.c xmlschemastypes.c: added Datatype ID
|
* relaxng.c valid.c xmlschemastypes.c: added Datatype ID
|
||||||
|
38
relaxng.c
38
relaxng.c
@ -1878,6 +1878,32 @@ xmlRelaxNGShowValidError(xmlRelaxNGValidCtxtPtr ctxt, xmlRelaxNGValidErr err,
|
|||||||
xmlFree(msg);
|
xmlFree(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* xmlRelaxNGPopErrors:
|
||||||
|
* @ctxt: the validation context
|
||||||
|
* @level: the error level in the stack
|
||||||
|
*
|
||||||
|
* pop and discard all errors until the given level is reached
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
xmlRelaxNGPopErrors(xmlRelaxNGValidCtxtPtr ctxt, int level) {
|
||||||
|
int i;
|
||||||
|
xmlRelaxNGValidErrorPtr err;
|
||||||
|
|
||||||
|
for (i = level;i < ctxt->errNr;i++) {
|
||||||
|
err = &ctxt->errTab[i];
|
||||||
|
if (err->flags & ERROR_IS_DUP) {
|
||||||
|
if (err->arg1 != NULL)
|
||||||
|
xmlFree((xmlChar *)err->arg1);
|
||||||
|
err->arg1 = NULL;
|
||||||
|
if (err->arg2 != NULL)
|
||||||
|
xmlFree((xmlChar *)err->arg2);
|
||||||
|
err->arg2 = NULL;
|
||||||
|
err->flags = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ctxt->errNr = level;
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* xmlRelaxNGDumpValidError:
|
* xmlRelaxNGDumpValidError:
|
||||||
* @ctxt: the validation context
|
* @ctxt: the validation context
|
||||||
@ -6925,7 +6951,7 @@ xmlRelaxNGValidateValue(xmlRelaxNGValidCtxtPtr ctxt,
|
|||||||
if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
|
if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
|
||||||
xmlRelaxNGDumpValidError(ctxt);
|
xmlRelaxNGDumpValidError(ctxt);
|
||||||
} else {
|
} else {
|
||||||
ctxt->errNr = 0;
|
if (ctxt->errNr > 0) xmlRelaxNGPopErrors(ctxt, 0);
|
||||||
}
|
}
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
xmlRelaxNGNextValue(ctxt);
|
xmlRelaxNGNextValue(ctxt);
|
||||||
@ -7030,7 +7056,7 @@ xmlRelaxNGValidateValue(xmlRelaxNGValidCtxtPtr ctxt,
|
|||||||
if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
|
if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
|
||||||
xmlRelaxNGDumpValidError(ctxt);
|
xmlRelaxNGDumpValidError(ctxt);
|
||||||
} else {
|
} else {
|
||||||
ctxt->errNr = 0;
|
if (ctxt->errNr > 0) xmlRelaxNGPopErrors(ctxt, 0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -7498,7 +7524,7 @@ done:
|
|||||||
cur = cur->prev;
|
cur = cur->prev;
|
||||||
}
|
}
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
ctxt->errNr = errNr;
|
if (ctxt->errNr > errNr) xmlRelaxNGPopErrors(ctxt, errNr);
|
||||||
}
|
}
|
||||||
|
|
||||||
xmlFree(list);
|
xmlFree(list);
|
||||||
@ -7632,7 +7658,7 @@ xmlRelaxNGElementMatch(xmlRelaxNGValidCtxtPtr ctxt,
|
|||||||
if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
|
if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
|
||||||
xmlRelaxNGDumpValidError(ctxt);
|
xmlRelaxNGDumpValidError(ctxt);
|
||||||
} else {
|
} else {
|
||||||
ctxt->errNr = 0;
|
if (ctxt->errNr > 0) xmlRelaxNGPopErrors(ctxt, 0);
|
||||||
}
|
}
|
||||||
ret = 0;
|
ret = 0;
|
||||||
ctxt->flags = oldflags;
|
ctxt->flags = oldflags;
|
||||||
@ -7836,7 +7862,7 @@ xmlRelaxNGValidateState(xmlRelaxNGValidCtxtPtr ctxt,
|
|||||||
if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
|
if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
|
||||||
xmlRelaxNGDumpValidError(ctxt);
|
xmlRelaxNGDumpValidError(ctxt);
|
||||||
} else {
|
} else {
|
||||||
ctxt->errNr = errNr;
|
if (ctxt->errNr > errNr) xmlRelaxNGPopErrors(ctxt, errNr);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
@ -8057,7 +8083,7 @@ xmlRelaxNGValidateState(xmlRelaxNGValidCtxtPtr ctxt,
|
|||||||
if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
|
if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
|
||||||
xmlRelaxNGDumpValidError(ctxt);
|
xmlRelaxNGDumpValidError(ctxt);
|
||||||
} else if ((ctxt->flags & FLAGS_IGNORABLE) == 0) {
|
} else if ((ctxt->flags & FLAGS_IGNORABLE) == 0) {
|
||||||
ctxt->errNr = errNr;
|
if (ctxt->errNr > errNr) xmlRelaxNGPopErrors(ctxt, errNr);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1056,6 +1056,73 @@ error:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* xmlSchemaValAtomicListNode:
|
||||||
|
* @type: the predefined atomic type for a token in the list
|
||||||
|
* @value: the list value to check
|
||||||
|
* @ret: the return computed value
|
||||||
|
* @node: the node containing the value
|
||||||
|
*
|
||||||
|
* Check that a value conforms to the lexical space of the predefined
|
||||||
|
* list type. if true a value is computed and returned in @ret.
|
||||||
|
*
|
||||||
|
* Returns 0 if this validates, a positive error code number otherwise
|
||||||
|
* and -1 in case of internal or API error.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
xmlSchemaValAtomicListNode(xmlSchemaTypePtr type, const xmlChar *value,
|
||||||
|
xmlSchemaValPtr *ret, xmlNodePtr node) {
|
||||||
|
xmlChar *val, *cur, *endval;
|
||||||
|
int nb_values = 0;
|
||||||
|
int tmp;
|
||||||
|
|
||||||
|
if (value == NULL) {
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
val = xmlStrdup(value);
|
||||||
|
if (val == NULL) {
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
cur = val;
|
||||||
|
/*
|
||||||
|
* Split the list
|
||||||
|
*/
|
||||||
|
while (IS_BLANK(*cur)) cur++;
|
||||||
|
while (*cur != 0) {
|
||||||
|
if (IS_BLANK(*cur)) {
|
||||||
|
*cur = 0;
|
||||||
|
cur++;
|
||||||
|
while (IS_BLANK(*cur)) *cur++ = 0;
|
||||||
|
} else {
|
||||||
|
nb_values++;
|
||||||
|
cur++;
|
||||||
|
while ((*cur != 0) && (!IS_BLANK(*cur))) cur++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (nb_values == 0) {
|
||||||
|
if (ret != NULL) {
|
||||||
|
TODO
|
||||||
|
}
|
||||||
|
xmlFree(val);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
endval = cur;
|
||||||
|
cur = val;
|
||||||
|
while ((*cur == 0) && (cur != endval)) cur++;
|
||||||
|
while (cur != endval) {
|
||||||
|
tmp = xmlSchemaValPredefTypeNode(type, cur, NULL, node);
|
||||||
|
if (tmp != 0)
|
||||||
|
break;
|
||||||
|
while (*cur != 0) cur++;
|
||||||
|
while ((*cur == 0) && (cur != endval)) cur++;
|
||||||
|
}
|
||||||
|
xmlFree(val);
|
||||||
|
if (ret != NULL) {
|
||||||
|
TODO
|
||||||
|
}
|
||||||
|
return(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* xmlSchemaValPredefTypeNode:
|
* xmlSchemaValPredefTypeNode:
|
||||||
* @type: the predefined type
|
* @type: the predefined type
|
||||||
@ -1425,6 +1492,16 @@ xmlSchemaValPredefTypeNode(xmlSchemaTypePtr type, const xmlChar *value,
|
|||||||
attr->atype = XML_ATTRIBUTE_IDREF;
|
attr->atype = XML_ATTRIBUTE_IDREF;
|
||||||
}
|
}
|
||||||
return(ret);
|
return(ret);
|
||||||
|
} else if (type == xmlSchemaTypeIdrefsDef) {
|
||||||
|
ret = xmlSchemaValAtomicListNode(xmlSchemaTypeIdrefDef,
|
||||||
|
value, val, node);
|
||||||
|
if ((ret == 0) && (node != NULL) &&
|
||||||
|
(node->type == XML_ATTRIBUTE_NODE)) {
|
||||||
|
xmlAttrPtr attr = (xmlAttrPtr) node;
|
||||||
|
|
||||||
|
attr->atype = XML_ATTRIBUTE_IDREFS;
|
||||||
|
}
|
||||||
|
return(ret);
|
||||||
} else if (type == xmlSchemaTypeIdDef) {
|
} else if (type == xmlSchemaTypeIdDef) {
|
||||||
ret = xmlValidateNCName(value, 1);
|
ret = xmlValidateNCName(value, 1);
|
||||||
if ((ret == 0) && (val != NULL)) {
|
if ((ret == 0) && (val != NULL)) {
|
||||||
|
Reference in New Issue
Block a user