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 8 Aug 2003 05:30:04 -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; *************** *** 413,418 **** --- 421,430 ---- if (value->value.qname.name != NULL) xmlFree(value->value.qname.name); break; + case XML_SCHEMAS_HEXBINARY: + if (value->value.hex.str != NULL) + xmlFree(value->value.hex.str); + break; default: break; } *************** *** 1919,1984 **** goto return0; } 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')) || ! ((*tmp >= 'a') && (*tmp <= 'f'))) { ! i++;tmp++; } ! 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; - } - } goto return0; } case XML_SCHEMAS_INTEGER: --- 1931,1979 ---- goto return0; } case XML_SCHEMAS_HEXBINARY: { ! const xmlChar *cur = value; ! xmlChar *base; int total, i = 0; ! if (cur == NULL) ! goto return1; ! ! while (((*cur >= '0') && (*cur <= '9')) || ! ((*cur >= 'A') && (*cur <= 'F')) || ! ((*cur >= 'a') && (*cur <= 'f'))) { ! i++;cur++; } ! if (*cur != 0) goto return1; if ((i % 2) != 0) goto return1; ! if (val != NULL) { ! v = xmlSchemaNewValue(XML_SCHEMAS_HEXBINARY); ! if (v == NULL) ! goto error; ! cur = xmlStrdup(value); ! if (cur == NULL) { ! xmlFree(v); ! goto return1; ! } ! ! total = i / 2; /* number of octets */ ! ! base = (xmlChar *)cur; ! while (i-- > 0) { ! if (*base >= 'a') ! *base = *base - ('a' - 'A'); ! base++; ! } ! ! v->value.hex.str = (xmlChar *)cur; ! v->value.hex.total = total; ! *val = v; } goto return0; } case XML_SCHEMAS_INTEGER: *************** *** 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: --- 3124,3142 ---- } return (-2); case XML_SCHEMAS_HEXBINARY: ! if (y->type == XML_SCHEMAS_HEXBINARY) { ! if (x->value.hex.total == y->value.hex.total) { ! int ret = xmlStrcmp(x->value.hex.str, y->value.hex.str); ! if (ret > 0) ! return(1); ! else if (ret == 0) ! return(0); ! } ! else if (x->value.hex.total > y->value.hex.total) ! return(1); ! ! return(-1); ! } return (-2); case XML_SCHEMAS_STRING: case XML_SCHEMAS_IDREFS: *************** *** 3277,3285 **** 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: --- 3283,3291 ---- return(-1); } if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY)) ! len = val->value.hex.total; else { ! switch (base->flags) { case XML_SCHEMAS_IDREF: case XML_SCHEMAS_NORMSTRING: case XML_SCHEMAS_TOKEN: *************** *** 3288,3301 **** 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) --- 3294,3307 ---- 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)