peiyongz    2004/08/17 14:11:42

  Modified:    c/src/xercesc/framework/psvi XSValue.hpp XSValue.cpp
  Log:
  no more Unrepresentable
  
  Revision  Changes    Path
  1.5       +4 -2      xml-xerces/c/src/xercesc/framework/psvi/XSValue.hpp
  
  Index: XSValue.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/framework/psvi/XSValue.hpp,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- XSValue.hpp       13 Aug 2004 21:29:20 -0000      1.4
  +++ XSValue.hpp       17 Aug 2004 21:11:41 -0000      1.5
  @@ -56,6 +56,9 @@
   
   /*
    * $Log$
  + * Revision 1.5  2004/08/17 21:11:41  peiyongz
  + * no more Unrepresentable
  + *
    * Revision 1.4  2004/08/13 21:29:20  peiyongz
    * fMemAllocated
    *
  @@ -89,7 +92,6 @@
               st_Invalid,
               st_InvalidChar,     //for numeric
               st_InvalidRange,    //for numeric
  -            st_UnRepresentable, //for numeric
               st_NoCanRep,
               st_NoActVal,
               st_NotSupported,
  
  
  
  1.4       +88 -27    xml-xerces/c/src/xercesc/framework/psvi/XSValue.cpp
  
  Index: XSValue.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/framework/psvi/XSValue.cpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- XSValue.cpp       13 Aug 2004 21:29:21 -0000      1.3
  +++ XSValue.cpp       17 Aug 2004 21:11:41 -0000      1.4
  @@ -56,6 +56,9 @@
   
   /*
    * $Log$
  + * Revision 1.4  2004/08/17 21:11:41  peiyongz
  + * no more Unrepresentable
  + *
    * Revision 1.3  2004/08/13 21:29:21  peiyongz
    * fMemAllocated
    *
  @@ -365,7 +368,7 @@
               XMLFloat data(content, manager);
               if (data.isDataConverted())
               {
  -                context.fStatus = XSValueContext::st_UnRepresentable;
  +                context.fStatus = XSValueContext::st_InvalidRange;
                   return false;
               }
           }
  @@ -376,7 +379,7 @@
               XMLDouble  data(content, manager);
               if (data.isDataConverted())
               {
  -                context.fStatus = XSValueContext::st_UnRepresentable;
  +                context.fStatus = XSValueContext::st_InvalidRange;
                   return false;
               }
           }
  @@ -395,8 +398,8 @@
                    datatype == XSValue::dt_long               ||
                    datatype == XSValue::dt_unsignedLong        )
           {
  -            XMLCh* compareData = (XMLCh*) 
manager->allocate(XMLString::stringLen(content) * sizeof(XMLCh));
  -            ArrayJanitor<XMLCh> janName(compareData);
  +            XMLCh* compareData = (XMLCh*) 
manager->allocate((XMLString::stringLen(content) + 1) * sizeof(XMLCh));
  +            ArrayJanitor<XMLCh> janName(compareData, manager);
               int    signValue = 0;
               XMLBigInteger::parseBigInteger(content, compareData, signValue,  
manager);
   
  @@ -487,14 +490,20 @@
                   }
                   break;
               case XSValue::dt_unsignedLong:
  -                // error: > 18446744073709551615
  +                // error: < 0 || > 18446744073709551615 
                   {
  -                    if (XMLBigInteger::compareValues(compareData
  -                                                   , signValue
  -                                                   , XMLUni::fgULongMaxInc
  -                                                   , 1
  -                                                   , manager) 
  -                                                   == XMLNumber::GREATER_THAN)
  +                    if ((XMLBigInteger::compareValues(compareData
  +                                                    , signValue
  +                                                    , XMLUni::fgValueZero
  +                                                    , 0
  +                                                    , manager) 
  +                                                    == XMLNumber::LESS_THAN) ||
  +                        (XMLBigInteger::compareValues(compareData
  +                                                    , signValue
  +                                                    , XMLUni::fgULongMaxInc
  +                                                    , 1
  +                                                    , manager) 
  +                                                    == XMLNumber::GREATER_THAN))
                       {
                           context.fStatus = XSValueContext::st_InvalidRange;
                           return false;
  @@ -505,6 +514,7 @@
                   return false;
                   break;
               }
  +
           }
           /***
            *   For all singed integer types
  @@ -707,7 +717,11 @@
                           break;
                   }
   
  -                return (i == XMLUni::fgBooleanValueSpaceArraySize)? false : true;
  +                if (i == XMLUni::fgBooleanValueSpaceArraySize)
  +                {
  +                    context.fStatus = XSValueContext::st_Invalid;
  +                    return false;
  +                }
               }
               break;
           case XSValue::dt_hexBinary:
  @@ -997,7 +1011,7 @@
           }  
           else 
           {
  -            retVal = XMLBigInteger::getCanonicalRepresentation(content, manager);
  +            retVal = XMLBigInteger::getCanonicalRepresentation(content, manager, 
datatype == XSValue::dt_nonPositiveInteger);
   
               if (!retVal)
                   context.fStatus = XSValueContext::st_InvalidChar;
  @@ -1097,12 +1111,24 @@
               }
               break;
           case XSValue::dt_hexBinary: 
  -            //HexBin::getCanonicalRepresentation does validation automatically
  -            return HexBin::getCanonicalRepresentation(content, manager);
  +            {
  +                //HexBin::getCanonicalRepresentation does validation automatically
  +                XMLCh* canRep = HexBin::getCanonicalRepresentation(content, 
manager);
  +                if (!canRep)
  +                    context.fStatus = XSValueContext::st_Invalid;
  +
  +                return canRep;
  +            }
               break;
           case XSValue::dt_base64Binary:
  -            //Base64::getCanonicalRepresentation does validation automatically
  -            return Base64::getCanonicalRepresentation(content, manager);
  +            {
  +                //Base64::getCanonicalRepresentation does validation automatically
  +                XMLCh* canRep = Base64::getCanonicalRepresentation(content, 
manager);
  +                if (!canRep)
  +                    context.fStatus = XSValueContext::st_Invalid;
  +
  +                return canRep;
  +            }
               break;
           case XSValue::dt_anyURI:
           case XSValue::dt_QName:
  @@ -1199,19 +1225,37 @@
           }
           else if (datatype == XSValue::dt_float)
           {
  +            //XMLFloat takes care of 0, -0, -INF, INF and NaN
               //XMLFloat::checkBoundary() handles error and outofbound issues
               XMLFloat data(content, manager);
  -            XSValue* retVal = new (manager) XSValue(manager);
  -            retVal->fData.f_float = (float) data.getValue();
  -            return retVal;
  +            if (data.isDataConverted())
  +            {
  +                context.fStatus = XSValueContext::st_InvalidRange;
  +                return 0;
  +            }
  +            else
  +            {
  +                XSValue* retVal = new (manager) XSValue(manager);
  +                retVal->fData.f_float = (float) data.getValue();
  +                return retVal;
  +            }
           }
           else if (datatype == XSValue::dt_double)
           {
  +            //XMLDouble takes care of 0, -0, -INF, INF and NaN
               //XMLDouble::checkBoundary() handles error and outofbound issues
               XMLDouble  data(content, manager);
  -            XSValue* retVal = new (manager) XSValue(manager);
  -            retVal->fData.f_double = data.getValue();
  -            return retVal;
  +            if (data.isDataConverted())
  +            {
  +                context.fStatus = XSValueContext::st_InvalidRange;
  +                return 0;
  +            }
  +            else
  +            {
  +                XSValue* retVal = new (manager) XSValue(manager);
  +                retVal->fData.f_double = data.getValue();
  +                return retVal;
  +            }
           }
           else if (datatype == XSValue::dt_integer            ||
                    datatype == XSValue::dt_negativeInteger    ||
  @@ -1558,9 +1602,18 @@
               break;
           case XSValue::dt_hexBinary:
               {
  -                //todo: HexBinary::decode()
  +                XMLCh* decodedData = HexBin::decode(content, manager);
  +
  +                if (!decodedData)
  +                {
  +                    context.fStatus = XSValueContext::st_Invalid;
  +                    return 0;
  +                }
  +
                   XSValue* retVal = new (manager) XSValue(manager);
  -                return retVal;
  +                retVal->fData.f_strVal = decodedData;
  +                retVal->fMemAllocated = true;
  +                return retVal;                
               }       
               break;
           case XSValue::dt_base64Binary:
  @@ -1640,7 +1693,14 @@
       }
       else if (ct == convert_2_ulong)
       {
  +        if (-1 != XMLString::indexOf(content, chDash))
  +        {
  +            context.fStatus = XSValueContext::st_InvalidRange;
  +            return false;
  +        }
  +
           retVal.f_ulong = strtoul(nptr, &endptr, base);
  +
       }
   
       // check if all chars are valid char
  @@ -1653,9 +1713,10 @@
       // check if overflow/underflow occurs
       if (errno == ERANGE)
       {
  -        context.fStatus = XSValueContext::st_UnRepresentable;
  +        context.fStatus = XSValueContext::st_InvalidRange;
           return false;
       }
  +
   
       return true;
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to