Index: xmlschemastypes.c =================================================================== RCS file: /cvs/gnome/libxml2/xmlschemastypes.c,v retrieving revision 1.42 diff -c -r1.42 xmlschemastypes.c *** xmlschemastypes.c 5 Aug 2003 15:52:17 -0000 1.42 --- xmlschemastypes.c 6 Aug 2003 01:22:11 -0000 *************** *** 134,139 **** --- 134,146 ---- xmlChar *uri; }; + typedef struct _xmlSchemaValHex xmlSchemaValHex; + typedef xmlSchemaValHex *xmlSchemaValHexPtr; + struct _xmlSchemaValHex { + xmlChar *str; + unsigned int total; + }; + struct _xmlSchemaVal { xmlSchemaValType type; union { *************** *** 141,146 **** --- 148,154 ---- xmlSchemaValDate date; xmlSchemaValDuration dur; xmlSchemaValQName qname; + xmlSchemaValHex hex; float f; double d; int b; *************** *** 403,408 **** --- 411,420 ---- case XML_SCHEMAS_ENTITY: case XML_SCHEMAS_ENTITIES: case XML_SCHEMAS_NOTATION: + case XML_SCHEMAS_HEXBINARY: + if (value->value.hex.str != NULL) + xmlFree(value->value.hex.str); + break; case XML_SCHEMAS_ANYURI: if (value->value.str != NULL) xmlFree(value->value.str); *************** *** 1920,1931 **** } case XML_SCHEMAS_HEXBINARY: { const xmlChar *tmp, *cur = value; int total, i = 0; - unsigned long lo = 0, mi = 0, hi = 0; - unsigned long *base; ! if (cur == NULL) ! goto return1; tmp = cur; while (((*tmp >= '0') && (*tmp <= '9')) || ((*tmp >= 'A') && (*tmp <= 'F')) || --- 1932,1946 ---- } case XML_SCHEMAS_HEXBINARY: { const xmlChar *tmp, *cur = value; + xmlChar *base; int total, i = 0; ! if (cur == NULL) ! goto return1; ! ! while ((cur[0] == '0') && (cur[1] == '0') && (cur[2] != 0)) ! cur += 2; ! tmp = cur; while (((*tmp >= '0') && (*tmp <= '9')) || ((*tmp >= 'A') && (*tmp <= 'F')) || *************** *** 1935,1979 **** if (*tmp != 0) goto return1; - if (i > 24) - goto return1; if ((i % 2) != 0) goto return1; ! total = i / 2; /* number of octets */ ! if (i >= 16) ! base = &hi; ! else if (i >= 8) ! base = &mi; ! else ! base = &lo; while (i > 0) { ! if ((*cur >= '0') && (*cur <= '9')) { ! *base = *base * 16 + (*cur - '0'); ! } else if ((*cur >= 'A') && (*cur <= 'F')) { ! *base = *base * 16 + (*cur - 'A') + 10; } else if ((*cur >= 'a') && (*cur <= 'f')) { ! *base = *base * 16 + (*cur - 'a') + 10; ! } else ! break; ! cur++; i--; - if (i == 16) - base = &mi; - else if (i == 8) - base = &lo; } if (val != NULL) { v = xmlSchemaNewValue(XML_SCHEMAS_HEXBINARY); if (v != NULL) { ! v->value.decimal.lo = lo; ! v->value.decimal.mi = mi; ! v->value.decimal.hi = hi; ! v->value.decimal.total = total; *val = v; } else { goto error; --- 1950,1983 ---- if (*tmp != 0) goto return1; if ((i % 2) != 0) goto return1; ! tmp = xmlMalloc(i+1); ! if (tmp == NULL) ! goto return1; ! total = i / 2; /* number of octets */ + base = (xmlChar *)tmp; while (i > 0) { ! if (((*cur >= '0') && (*cur <= '9')) || ! ((*cur >= 'A') && (*cur <= 'F'))) { ! *base = *cur; } else if ((*cur >= 'a') && (*cur <= 'f')) { ! *base = *cur - ('a' - 'A'); ! } ! cur++;base++; i--; } + *base = 0; if (val != NULL) { v = xmlSchemaNewValue(XML_SCHEMAS_HEXBINARY); if (v != NULL) { ! v->value.hex.str = (xmlChar *)tmp; ! v->value.hex.total = total; *val = v; } else { goto error; *************** *** 3129,3136 **** } return (-2); case XML_SCHEMAS_HEXBINARY: ! if (y->type == XML_SCHEMAS_HEXBINARY) ! return (xmlSchemaCompareDecimals(x, y)); return (-2); case XML_SCHEMAS_STRING: case XML_SCHEMAS_IDREFS: --- 3133,3147 ---- } return (-2); case XML_SCHEMAS_HEXBINARY: ! if (y->type == XML_SCHEMAS_HEXBINARY) { ! if (x->value.hex.total == y->value.hex.total) ! return(xmlStrcmp(x->value.hex.str, x->value.hex.str)); ! else if (x->value.hex.total > y->value.hex.total) ! return(1); ! else ! return(-1); ! ! } return (-2); case XML_SCHEMAS_STRING: case XML_SCHEMAS_IDREFS: *************** *** 3276,3301 **** (facet->val->value.decimal.frac != 0)) { return(-1); } ! if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY)) ! len = val->value.decimal.total; ! else { ! switch (base->flags) { ! case XML_SCHEMAS_IDREF: ! case XML_SCHEMAS_NORMSTRING: ! case XML_SCHEMAS_TOKEN: ! case XML_SCHEMAS_LANGUAGE: ! case XML_SCHEMAS_NMTOKEN: ! case XML_SCHEMAS_NAME: ! case XML_SCHEMAS_NCNAME: ! case XML_SCHEMAS_ID: ! len = xmlSchemaNormLen(value); ! break; ! case XML_SCHEMAS_STRING: ! len = xmlUTF8Strlen(value); ! break; ! default: ! TODO ! } } if (facet->type == XML_SCHEMA_FACET_LENGTH) { if (len != facet->val->value.decimal.lo) --- 3287,3329 ---- (facet->val->value.decimal.frac != 0)) { return(-1); } ! switch (base->flags) { ! case XML_SCHEMAS_IDREF: ! case XML_SCHEMAS_NORMSTRING: ! case XML_SCHEMAS_TOKEN: ! case XML_SCHEMAS_LANGUAGE: ! case XML_SCHEMAS_NMTOKEN: ! case XML_SCHEMAS_NAME: ! case XML_SCHEMAS_NCNAME: ! case XML_SCHEMAS_ID: ! len = xmlSchemaNormLen(value); ! break; ! case XML_SCHEMAS_STRING: ! len = xmlUTF8Strlen(value); ! break; ! case XML_SCHEMAS_HEXBINARY: ! if (val == NULL) ! return(-1); ! len = val->value.hex.total; ! break; ! case XML_SCHEMAS_DECIMAL: ! case XML_SCHEMAS_INTEGER: ! case XML_SCHEMAS_PINTEGER: ! case XML_SCHEMAS_NPINTEGER: ! case XML_SCHEMAS_NINTEGER: ! case XML_SCHEMAS_NNINTEGER: ! case XML_SCHEMAS_LONG: ! case XML_SCHEMAS_BYTE: ! case XML_SCHEMAS_SHORT: ! case XML_SCHEMAS_INT: ! case XML_SCHEMAS_ULONG: ! case XML_SCHEMAS_UBYTE: ! case XML_SCHEMAS_USHORT: ! case XML_SCHEMAS_UINT: ! return(-1); ! break; ! default: ! TODO } if (facet->type == XML_SCHEMA_FACET_LENGTH) { if (len != facet->val->value.decimal.lo)