Index: xmlschemastypes.c =================================================================== RCS file: /cvs/gnome/libxml2/xmlschemastypes.c,v retrieving revision 1.39 diff -c -r1.39 xmlschemastypes.c *** xmlschemastypes.c 12 May 2003 15:25:55 -0000 1.39 --- xmlschemastypes.c 6 Jul 2003 19:42:22 -0000 *************** *** 82,88 **** XML_SCHEMAS_SHORT, XML_SCHEMAS_USHORT, XML_SCHEMAS_BYTE, ! XML_SCHEMAS_UBYTE } xmlSchemaValType; static unsigned long powten[10] = { --- 82,89 ---- XML_SCHEMAS_SHORT, XML_SCHEMAS_USHORT, XML_SCHEMAS_BYTE, ! XML_SCHEMAS_UBYTE, ! XML_SCHEMAS_HEXBINARY } xmlSchemaValType; static unsigned long powten[10] = { *************** *** 169,174 **** --- 170,176 ---- static xmlSchemaTypePtr xmlSchemaTypeFloatDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeBooleanDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeDoubleDef = NULL; + static xmlSchemaTypePtr xmlSchemaTypeHexBinaryDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeAnyURIDef = NULL; /* *************** *** 278,283 **** --- 280,287 ---- XML_SCHEMAS_BOOLEAN); xmlSchemaTypeAnyURIDef = xmlSchemaInitBasicType("anyURI", XML_SCHEMAS_ANYURI); + xmlSchemaTypeHexBinaryDef = xmlSchemaInitBasicType("hexBinary", + XML_SCHEMAS_HEXBINARY); /* * derived datatypes *************** *** 1914,1919 **** --- 1918,1984 ---- xmlFreeURI(uri); 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; + + 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: case XML_SCHEMAS_PINTEGER: case XML_SCHEMAS_NPINTEGER: *************** *** 2052,2057 **** --- 2117,2124 ---- int total = 0; if (cur == NULL) goto return1; + if (*cur == '+') + cur++; ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); if (ret <= 0) goto return1; *************** *** 3061,3066 **** --- 3128,3137 ---- return(1); } 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: case XML_SCHEMAS_ENTITIES: *************** *** 3205,3226 **** (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; ! default: ! TODO } if (facet->type == XML_SCHEMA_FACET_LENGTH) { if (len != facet->val->value.decimal.lo) --- 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) *************** *** 3234,3239 **** --- 3309,3349 ---- } break; } + case XML_SCHEMA_FACET_TOTALDIGITS: + case XML_SCHEMA_FACET_FRACTIONDIGITS: + + if ((facet->val == NULL) || + ((facet->val->type != XML_SCHEMAS_DECIMAL) && + (facet->val->type != XML_SCHEMAS_NNINTEGER)) || + (facet->val->value.decimal.frac != 0)) { + return(-1); + } + if ((val == NULL) || + ((val->type != XML_SCHEMAS_DECIMAL) && + (val->type != XML_SCHEMAS_INTEGER) && + (val->type != XML_SCHEMAS_NPINTEGER) && + (val->type != XML_SCHEMAS_NINTEGER) && + (val->type != XML_SCHEMAS_NNINTEGER) && + (val->type != XML_SCHEMAS_PINTEGER) && + (val->type != XML_SCHEMAS_INT) && + (val->type != XML_SCHEMAS_UINT) && + (val->type != XML_SCHEMAS_LONG) && + (val->type != XML_SCHEMAS_ULONG) && + (val->type != XML_SCHEMAS_SHORT) && + (val->type != XML_SCHEMAS_USHORT) && + (val->type != XML_SCHEMAS_BYTE) && + (val->type != XML_SCHEMAS_UBYTE))) { + return(-1); + } + if (facet->type == XML_SCHEMA_FACET_TOTALDIGITS) { + if (val->value.decimal.total > facet->val->value.decimal.lo) + return(1); + + } else if (facet->type == XML_SCHEMA_FACET_FRACTIONDIGITS) { + if (val->value.decimal.frac > facet->val->value.decimal.lo) + return(1); + } + break; default: TODO }