peiyongz    2004/10/27 14:52:04

  Modified:    c/src/xercesc/framework/psvi XSValue.cpp
  Log:
  Set status for invalid data -- patch from David Bertoni
  
  Revision  Changes    Path
  1.16      +165 -80   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.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- XSValue.cpp       20 Oct 2004 15:18:20 -0000      1.15
  +++ XSValue.cpp       27 Oct 2004 21:52:04 -0000      1.16
  @@ -16,6 +16,9 @@
   
   /*
    * $Log$
  + * Revision 1.16  2004/10/27 21:52:04  peiyongz
  + * Set status for invalid data -- patch from David Bertoni
  + *
    * Revision 1.15  2004/10/20 15:18:20  knoaman
    * Allow option of initializing static data in XMLPlatformUtils::Initialize
    *
  @@ -630,6 +633,7 @@
                   }
                   break;
               default:
  +                status = st_NotSupported;            
                   return false;
                   break;
               }
  @@ -744,6 +748,7 @@
                   }
                   break;
               default:
  +                status = st_NotSupported;            
                   return false;
                   break;
               } 
  @@ -832,7 +837,10 @@
                               ,       XMLVersion           version
                               ,       MemoryManager* const manager)
   {
  -
  +    bool isValid = true;
  +    // Set this here, because we want to check it at the end.
  +    status = st_Init;
  +    
       try
       {
           switch (datatype)
  @@ -848,8 +856,7 @@
   
                   if (i == XMLUni::fgBooleanValueSpaceArraySize)
                   {
  -                    status = st_FOCA0002;
  -                    return false;
  +                    isValid = false;                 
                   }
               }
               break;
  @@ -857,8 +864,7 @@
               {
                   if (HexBin::getDataLength(content) == -1) 
                   {
  -                    status = st_FOCA0002;
  -                    return false;
  +                    isValid = false;                 
                   }
               }
               break;
  @@ -866,68 +872,95 @@
               {
                   if (Base64::getDataLength(content, manager) == -1) 
                   {
  -                    status = st_FOCA0002;
  -                    return false;
  +                    isValid = false;                 
                   }
               }
               break;
           case XSValue::dt_anyURI:
  -            return XMLUri::isValidURI(true, content);
  +            if (XMLUri::isValidURI(true, content) == false)
  +            {
  +                isValid = false;
  +            }        
               break;
           case XSValue::dt_QName:
  -            return (version == ver_10) ? 
  +            isValid = (version == ver_10) ? 
                   XMLChar1_0::isValidQName(content, XMLString::stringLen(content)) :
                   XMLChar1_1::isValidQName(content, XMLString::stringLen(content));
               break;
           case XSValue::dt_NOTATION:
  -            return XMLString::isValidNOTATION(content, manager);
  +            if ( XMLString::isValidNOTATION(content, manager) == false)
  +            {
  +             isValid = false;
  +            }
               break;
           case XSValue::dt_string:
               {
  -                XMLCh*   rawPtr = (XMLCh*) content;
  +                const XMLCh*   rawPtr = content;
   
                   if (version == ver_10)
                   {
                       while (*rawPtr) 
                           if (!XMLChar1_0::isXMLChar(*rawPtr++)) 
  -                            return false;
  +                        {
  +                            isValid = false;
  +                            break;
  +                        }
                   }
                   else
                   {
                       while (*rawPtr) 
                           if (!XMLChar1_1::isXMLChar(*rawPtr++)) 
  -                            return false;
  +                        {
  +                            isValid = false;
  +                            break;
  +                        }
                   }
   
               }
               break;
           case XSValue::dt_normalizedString:
               {
  -                XMLCh*   rawPtr = (XMLCh*) content;
  +                const XMLCh*   rawPtr = content;
   
                   if (version == ver_10)
                   {
                       while (*rawPtr) 
                       {
                           if (!XMLChar1_0::isXMLChar(*rawPtr)) 
  -                            return false;
  -
  -                        if (*rawPtr == chCR || *rawPtr == chLF || *rawPtr == chHTab 
)
  -                            return false;
  -
  -                        rawPtr++;
  +                        {
  +                            isValid = false;
  +                            break;
  +                        }
  +                        else if (*rawPtr == chCR || *rawPtr == chLF || *rawPtr == 
chHTab )
  +                        {
  +                            isValid = false;
  +                            break;
  +                        }
  +                        else
  +                        {
  +                            rawPtr++;
  +                        }
                       }
                   }
                   else
                   {
                       while (*rawPtr) 
                       {
  -                        if (!XMLChar1_1::isXMLChar(*rawPtr)) return false;
  -
  -                        if (*rawPtr == chCR || *rawPtr == chLF || *rawPtr == chHTab 
)
  -                            return false;
  -
  -                        rawPtr++;
  +                        if (!XMLChar1_1::isXMLChar(*rawPtr)) 
  +                        {
  +                            isValid = false;
  +                            break;
  +                        }
  +                        else if (*rawPtr == chCR || *rawPtr == chLF || *rawPtr == 
chHTab )
  +                        {
  +                            isValid = false;
  +                            break;
  +                        }
  +                        else
  +                        {
  +                            rawPtr++;
  +                        }
  +                                             
                       }
                   }
   
  @@ -937,7 +970,7 @@
           case XSValue::dt_language:
               {
                   unsigned int strLen = XMLString::stringLen(content);
  -                XMLCh*   rawPtr = (XMLCh*) content;
  +                const XMLCh*  rawPtr = content;
                   bool     inWS = false;
   
                   if (version == ver_10)
  @@ -945,28 +978,43 @@
   
                       // Check leading/Trailing white space
                       if (XMLChar1_0::isWhitespace(content[0])      ||
  -                        XMLChar1_0::isWhitespace(content[strLen])  )
  -                        return false;
  -
  -                    while (*rawPtr) 
  +                        XMLChar1_0::isWhitespace(content[strLen - 1])  )
                       {
  -                        if (!XMLChar1_0::isXMLChar(*rawPtr)) 
  -                            return false;
  -
  -                        if (*rawPtr == chCR || *rawPtr == chLF || *rawPtr == chHTab 
)
  -                            return false;
  -
  -                        if (XMLChar1_0::isWhitespace(*rawPtr))
  +                        isValid = false;
  +                    }
  +                    else
  +                    {
  +                        while (*rawPtr) 
                           {
  -                            if (inWS)
  -                                return false;
  +                            if (!XMLChar1_0::isXMLChar(*rawPtr)) 
  +                            {
  +                                isValid = false;
  +                                break;
  +                            }
  +                            else if (*rawPtr == chCR || *rawPtr == chLF || *rawPtr 
== chHTab )
  +                            {
  +                                isValid = false;
  +                                break;
  +                            }                            
  +                            else if (XMLChar1_0::isWhitespace(*rawPtr))
  +                            {
  +                                if (inWS)
  +                                {
  +                                    isValid = false;
  +                                    break;
  +                                }
  +                                else
  +                                {
  +                                    inWS = true;
  +                                }
  +                            }
                               else
  -                                inWS = true;
  -                        }
  -                        else
  -                            inWS = false;
  +                            {
  +                                inWS = false;
  +                            }
   
  -                        rawPtr++;
  +                            rawPtr++;
  +                        }
                       }
                   }
                   else
  @@ -974,48 +1022,67 @@
   
                       // Check leading/Trailing white space
                       if (XMLChar1_1::isWhitespace(content[0])      ||
  -                        XMLChar1_1::isWhitespace(content[strLen])  )
  -                        return false;
  -
  -                    while (*rawPtr) 
  +                        XMLChar1_1::isWhitespace(content[strLen - 1])  )
                       {
  -                        if (!XMLChar1_1::isXMLChar(*rawPtr)) 
  -                            return false;
  -
  -                        if (*rawPtr == chCR || *rawPtr == chLF || *rawPtr == chHTab 
)
  -                            return false;
  -
  -                        if (XMLChar1_1::isWhitespace(*rawPtr))
  +                        isValid = false;
  +                    }
  +                    else
  +                    {
  +                        while (*rawPtr) 
                           {
  -                            if (inWS)
  -                                return false;
  +                            if (!XMLChar1_1::isXMLChar(*rawPtr)) 
  +                            {
  +                                isValid = false;
  +                                break;
  +                            }
  +                            else if (*rawPtr == chCR || *rawPtr == chLF || *rawPtr 
== chHTab )
  +                            {
  +                                isValid = false;
  +                                break;
  +                            }                            
  +                            else if (XMLChar1_1::isWhitespace(*rawPtr))
  +                            {
  +                                if (inWS)
  +                                {
  +                                    isValid = false;
  +                                    break;
  +                                }
  +                                else
  +                                {
  +                                    inWS = true;
  +                                }
  +                            }
                               else
  -                                inWS = true;
  -                        }
  -                        else
  -                            inWS = false;
  +                            {
  +                                inWS = false;
  +                            }
   
  -                        rawPtr++;
  -                    }
  +                            rawPtr++;
  +                        }
  +                    }                   
                   }
  -
               }
   
  -            if (datatype == XSValue::dt_language)
  +            if (isValid == true && datatype == XSValue::dt_language)
               {
                   RegularExpression* regEx = getRegEx();
                   if (!regEx)
                   {
                       status = st_CantCreateRegEx;
  -                    return false;
  +                    isValid = false;
  +                }
  +                else
  +                {
  +                    if (regEx->matches(content, manager) == false)
  +                    {
  +                        isValid = false;
  +                    }
                   }
  -
  -                return regEx->matches(content, manager);
               }
   
               break;
           case XSValue::dt_NMTOKEN:
  -            return (version == ver_10) ? 
  +            isValid = (version == ver_10) ? 
                   XMLChar1_0::isValidNmtoken(content, XMLString::stringLen(content)) :
                   XMLChar1_1::isValidNmtoken(content, XMLString::stringLen(content));
               break;
  @@ -1031,7 +1098,10 @@
                           const XMLCh* token = tokenizer.nextToken();
   
                           if (!XMLChar1_0::isValidNmtoken(token, 
XMLString::stringLen(token)))
  -                            return false;
  +                        {
  +                            isValid = false;
  +                            break;
  +                        }                        
                       }
                   }
                   else
  @@ -1041,13 +1111,16 @@
                           const XMLCh* token = tokenizer.nextToken();
   
                           if (!XMLChar1_1::isValidNmtoken(token, 
XMLString::stringLen(token)))
  -                            return false;
  +                        {
  +                            isValid = false;
  +                            break;
  +                        }                        
                       }
                   }
               }
               break;
           case XSValue::dt_Name:
  -            return (version == ver_10) ? 
  +            isValid = (version == ver_10) ? 
                   XMLChar1_0::isValidName(content, XMLString::stringLen(content)) :
                   XMLChar1_1::isValidName(content, XMLString::stringLen(content));
               break;
  @@ -1055,7 +1128,7 @@
           case XSValue::dt_ID:
           case XSValue::dt_IDREF:
           case XSValue::dt_ENTITY:
  -            return (version == ver_10) ? 
  +            isValid = (version == ver_10) ? 
                   XMLChar1_0::isValidNCName(content, XMLString::stringLen(content)) :
                   XMLChar1_1::isValidNCName(content, XMLString::stringLen(content));
               break;
  @@ -1071,7 +1144,10 @@
                           const XMLCh* token = tokenizer.nextToken();
   
                           if (!XMLChar1_0::isValidNCName(token, 
XMLString::stringLen(token)))
  -                            return false;
  +                        {
  +                            isValid = false;
  +                            break;
  +                        }                        
                       }
                   }
                   else
  @@ -1081,24 +1157,33 @@
                           const XMLCh* token = tokenizer.nextToken();
   
                           if (!XMLChar1_1::isValidNCName(token, 
XMLString::stringLen(token)))
  -                            return false;
  +                        {
  +                            isValid = false;
  +                            break;
  +                        }                        
                       }
                   }
               }
               break;
           default:
  -            return false;
  +            status = st_NotSupported;
  +            isValid = false;        
               break;
           }
   
  -        return true; //parsing succeed
       }
   
       catch (...)
       {
  +        isValid = false; 
  +    }
  +
  +    if (isValid == false && status == st_Init)
  +    {
           status = st_FOCA0002;
  -        return false; 
       }
  +
  +    return isValid;
   
   }
   
  
  
  

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

Reply via email to