diff --git a/src/xercesc/framework/psvi/XSValue.cpp b/src/xercesc/framework/psvi/XSValue.cpp
index 8371a4838f321c3c4ebd405bd2b24ccde387c8dc..9fc7e7695f7a2723d724fafa07dccd99cb734718 100644
--- a/src/xercesc/framework/psvi/XSValue.cpp
+++ b/src/xercesc/framework/psvi/XSValue.cpp
@@ -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 @@ XSValue::validateNumerics(const XMLCh*         const content
             XMLFloat data(content, manager);
             if (data.isDataConverted())
             {
-                context.fStatus = XSValueContext::st_UnRepresentable;
+                context.fStatus = XSValueContext::st_InvalidRange;
                 return false;
             }
         }
@@ -376,7 +379,7 @@ XSValue::validateNumerics(const XMLCh*         const content
             XMLDouble  data(content, manager);
             if (data.isDataConverted())
             {
-                context.fStatus = XSValueContext::st_UnRepresentable;
+                context.fStatus = XSValueContext::st_InvalidRange;
                 return false;
             }
         }
@@ -395,8 +398,8 @@ XSValue::validateNumerics(const XMLCh*         const content
                  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 @@ XSValue::validateNumerics(const XMLCh*         const content
                 }
                 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 @@ XSValue::validateNumerics(const XMLCh*         const content
                 return false;
                 break;
             }
+
         }
         /***
          *   For all singed integer types
@@ -707,7 +717,11 @@ bool XSValue::validateStrings(const XMLCh*         const content
                         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 @@ XMLCh* XSValue::getCanRepNumerics(const XMLCh*         const content
         }  
         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 @@ XMLCh* XSValue::getCanRepStrings(const XMLCh*         const content
             }
             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 @@ XSValue::getActValNumerics(const XMLCh*         const content
         }
         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 @@ XSValue::getActValStrings(const XMLCh*         const content
             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 @@ bool XSValue::getActualValue(const XMLCh*         const content
     }
     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,10 +1713,11 @@ bool XSValue::getActualValue(const XMLCh*         const content
     // check if overflow/underflow occurs
     if (errno == ERANGE)
     {
-        context.fStatus = XSValueContext::st_UnRepresentable;
+        context.fStatus = XSValueContext::st_InvalidRange;
         return false;
     }
 
+
     return true;
 }
 
diff --git a/src/xercesc/framework/psvi/XSValue.hpp b/src/xercesc/framework/psvi/XSValue.hpp
index f9fe5ff22b406ef000d0c6717d326a55215a491c..e68c18c19c5f5b5ff9ebf3941c93395d7c8c3ec3 100644
--- a/src/xercesc/framework/psvi/XSValue.hpp
+++ b/src/xercesc/framework/psvi/XSValue.hpp
@@ -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 @@ public:
             st_Invalid,
             st_InvalidChar,     //for numeric
             st_InvalidRange,    //for numeric
-            st_UnRepresentable, //for numeric
             st_NoCanRep,
             st_NoActVal,
             st_NotSupported,