You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by kn...@apache.org on 2003/08/14 04:57:27 UTC

cvs commit: xml-xerces/c/src/xercesc/util/regx RegularExpression.cpp RegularExpression.hpp

knoaman     2003/08/13 19:57:27

  Modified:    c/src/xercesc/util XMLBigDecimal.cpp XMLBigDecimal.hpp
                        XMLChar.hpp XMLDateTime.cpp XMLDateTime.hpp
                        XMLURL.cpp XMLURL.hpp
               c/src/xercesc/util/regx RegularExpression.cpp
                        RegularExpression.hpp
  Log:
  Code refactoring to improve performance of validation.
  
  Revision  Changes    Path
  1.10      +40 -15    xml-xerces/c/src/xercesc/util/XMLBigDecimal.cpp
  
  Index: XMLBigDecimal.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/XMLBigDecimal.cpp,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- XMLBigDecimal.cpp	16 May 2003 06:01:53 -0000	1.9
  +++ XMLBigDecimal.cpp	14 Aug 2003 02:57:27 -0000	1.10
  @@ -56,6 +56,9 @@
   
   /*
    * $Log$
  + * Revision 1.10  2003/08/14 02:57:27  knoaman
  + * Code refactoring to improve performance of validation.
  + *
    * Revision 1.9  2003/05/16 06:01:53  knoaman
    * Partial implementation of the configurable memory manager.
    *
  @@ -113,10 +116,9 @@
   //  Includes
   // ---------------------------------------------------------------------------
   #include <xercesc/util/XMLBigDecimal.hpp>
  -#include <xercesc/util/PlatformUtils.hpp>
   #include <xercesc/util/TransService.hpp>
   #include <xercesc/util/NumberFormatException.hpp>
  -#include <xercesc/util/XMLUniDefs.hpp>
  +#include <xercesc/util/XMLChar.hpp>
   
   
   XERCES_CPP_NAMESPACE_BEGIN
  @@ -142,8 +144,9 @@
   : fSign(0)
   , fTotalDigits(0)
   , fScale(0)
  -, fIntVal(0)
  +, fRawDataLen(0)
   , fRawData(0)
  +, fIntVal(0)
   , fMemoryManager(manager)
   {
       if ((!strValue) || (!*strValue))
  @@ -151,8 +154,14 @@
   
       try
       {
  -        parseBigDecimal(strValue);
  -        fRawData = XMLString::replicate(strValue, fMemoryManager);
  +        fRawDataLen = XMLString::stringLen(strValue);
  +        fRawData = (XMLCh*) fMemoryManager->allocate
  +        (
  +            ((fRawDataLen*2) + 2) * sizeof(XMLCh) //fRawData and fIntVal
  +        );
  +        memcpy(fRawData, strValue, (fRawDataLen+1) * sizeof(XMLCh));
  +        fIntVal = fRawData + fRawDataLen + 1;
  +        parseBigDecimal(strValue, fRawDataLen);
       }
       catch(...)
       {
  @@ -168,18 +177,39 @@
   
   void XMLBigDecimal::cleanUp()
   {
  -    if (fIntVal)
  -        fMemoryManager->deallocate(fIntVal); //delete [] fIntVal;
  +//    if (fIntVal)
  +//        fMemoryManager->deallocate(fIntVal); //delete [] fIntVal;
   
       if (fRawData)
           fMemoryManager->deallocate(fRawData); //XMLString::release(&fRawData);
   }
   
  -void XMLBigDecimal::parseBigDecimal(const XMLCh* const toConvert)
  +void XMLBigDecimal::setDecimalValue(const XMLCh* const strValue)
  +{
  +    fScale = fTotalDigits = 0;
  +    unsigned int valueLen = XMLString::stringLen(strValue);
  +
  +    if (valueLen > fRawDataLen) {
  +
  +        fMemoryManager->deallocate(fRawData);
  +        fRawDataLen = valueLen;
  +        fRawData = (XMLCh*) fMemoryManager->allocate
  +        (
  +            ((fRawDataLen*2) + 2) * sizeof(XMLCh)
  +        );//XMLString::replicate(strValue, fMemoryManager);
  +        fIntVal = fRawData + fRawDataLen + 1;
  +    }
  +
  +    memcpy(fRawData, strValue, (valueLen + 1) * sizeof(XMLCh));
  +    parseBigDecimal(strValue, valueLen);
  +}
  +
  +void XMLBigDecimal::parseBigDecimal(const XMLCh* const toConvert
  +                                    , unsigned int     toConvertLen)
   {
       // Scan past any whitespace. If we hit the end, then return failure
       const XMLCh* startPtr = toConvert;
  -    while (XMLPlatformUtils::fgTransService->isSpace(*startPtr))
  +    while (XMLChar1_0::isWhitespace(*startPtr))
           startPtr++;
   
       if (!*startPtr)
  @@ -187,7 +217,7 @@
   
       // Start at the end and work back through any whitespace
       const XMLCh* endPtr = toConvert + XMLString::stringLen(toConvert);
  -    while (XMLPlatformUtils::fgTransService->isSpace(*(endPtr - 1)))
  +    while (XMLChar1_0::isWhitespace(*(endPtr - 1)))
           endPtr--;
   
       // '+' or '-' is allowed only at the first position
  @@ -211,15 +241,10 @@
       if (!*startPtr)
       {
           fSign = 0;
  -        fIntVal = (XMLCh*) fMemoryManager->allocate(sizeof(XMLCh)); //new XMLCh[1];
           fIntVal[0] = chNull;
           return;
       }
   
  -    fIntVal = (XMLCh*) fMemoryManager->allocate
  -    (
  -        (endPtr - startPtr + 1) * sizeof(XMLCh)
  -    ); //new XMLCh[endPtr - startPtr + 1];
       XMLCh* retPtr = fIntVal;
   
       // Scan data
  
  
  
  1.11      +12 -3     xml-xerces/c/src/xercesc/util/XMLBigDecimal.hpp
  
  Index: XMLBigDecimal.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/XMLBigDecimal.hpp,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- XMLBigDecimal.hpp	16 May 2003 06:01:53 -0000	1.10
  +++ XMLBigDecimal.hpp	14 Aug 2003 02:57:27 -0000	1.11
  @@ -121,8 +121,16 @@
        */
        int toCompare(const XMLBigDecimal& other) const;
   
  +    /*
  +     * Sets the value to be converted
  +     *
  +     * @param   strValue the value to convert
  +     */
  +    void setDecimalValue(const XMLCh* const strValue);
  +
   private:
  -    void  parseBigDecimal(const XMLCh* const strValue);
  +    void  parseBigDecimal( const XMLCh* const strValue
  +                         , unsigned int       strValueLen);
       void  cleanUp();
       
       // -----------------------------------------------------------------------
  @@ -157,8 +165,9 @@
       int            fSign;
       unsigned int   fTotalDigits;
       unsigned int   fScale;
  -    XMLCh*         fIntVal;    
  +    unsigned int   fRawDataLen;
       XMLCh*         fRawData;
  +    XMLCh*         fIntVal;
       MemoryManager* fMemoryManager;
   };
   
  
  
  
  1.2       +11 -2     xml-xerces/c/src/xercesc/util/XMLChar.hpp
  
  Index: XMLChar.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/XMLChar.hpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XMLChar.hpp	20 Dec 2002 22:10:21 -0000	1.1
  +++ XMLChar.hpp	14 Aug 2003 02:57:27 -0000	1.2
  @@ -56,6 +56,9 @@
   
   /*
    * $Log$
  + * Revision 1.2  2003/08/14 02:57:27  knoaman
  + * Code refactoring to improve performance of validation.
  + *
    * Revision 1.1  2002/12/20 22:10:21  tng
    * XML 1.1
    *
  @@ -130,7 +133,8 @@
       static bool isPlainContentChar(const XMLCh toCheck, const XMLCh toCheck2 = 0);
       static bool isSpecialStartTagChar(const XMLCh toCheck, const XMLCh toCheck2 = 0);
       static bool isXMLChar(const XMLCh toCheck, const XMLCh toCheck2 = 0);
  -    static bool isWhitespace(const XMLCh toCheck, const XMLCh toCheck2 = 0);
  +    static bool isWhitespace(const XMLCh toCheck);
  +    static bool isWhitespace(const XMLCh toCheck, const XMLCh toCheck2);
       static bool isControlChar(const XMLCh toCheck, const XMLCh toCheck2 = 0);
   
       static bool isPublicIdChar(const XMLCh toCheck, const XMLCh toCheck2 = 0);
  @@ -222,6 +226,11 @@
                  return true;
       }
       return false;
  +}
  +
  +inline bool XMLChar1_0::isWhitespace(const XMLCh toCheck)
  +{
  +    return ((fgCharCharsTable1_0[toCheck] & gWhitespaceCharMask) != 0);
   }
   
   inline bool XMLChar1_0::isWhitespace(const XMLCh toCheck, const XMLCh toCheck2)
  
  
  
  1.13      +21 -13    xml-xerces/c/src/xercesc/util/XMLDateTime.cpp
  
  Index: XMLDateTime.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/XMLDateTime.cpp,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- XMLDateTime.cpp	22 May 2003 02:10:52 -0000	1.12
  +++ XMLDateTime.cpp	14 Aug 2003 02:57:27 -0000	1.13
  @@ -57,6 +57,9 @@
   /*
    * $Id$
    * $Log$
  + * Revision 1.13  2003/08/14 02:57:27  knoaman
  + * Code refactoring to improve performance of validation.
  + *
    * Revision 1.12  2003/05/22 02:10:52  knoaman
    * Default the memory manager.
    *
  @@ -480,7 +483,10 @@
   }
   
   XMLDateTime::XMLDateTime(MemoryManager* const manager)
  -: fBuffer(0)
  +: fStart(0)
  +, fEnd(0)
  +, fBufferMaxLen(0)
  +, fBuffer(0)
   , fMemoryManager(manager)
   {
       reset();
  @@ -488,7 +494,10 @@
   
   XMLDateTime::XMLDateTime(const XMLCh* const aString,
                            MemoryManager* const manager)
  -: fBuffer(0)
  +: fStart(0)
  +, fEnd(0)
  +, fBufferMaxLen(0)
  +, fBuffer(0)
   , fMemoryManager(manager)
   {
       setBuffer(aString);
  @@ -499,7 +508,8 @@
   // -----------------------------------------------------------------------
   
   XMLDateTime::XMLDateTime(const XMLDateTime &toCopy)
  -: fBuffer(0)
  +: fBufferMaxLen(0)
  +, fBuffer(0)
   , fMemoryManager(toCopy.fMemoryManager)
   {
       copy(toCopy);
  @@ -1374,18 +1384,16 @@
   //
   int XMLDateTime::parseInt(const int start, const int end) const
   {
  +    unsigned int retVal = 0;
  +    for (int i=start; i < end; i++) {
   
  -    XMLCh* strToScan = (XMLCh*) fMemoryManager->allocate
  -    (
  -        (end - start + 1) * sizeof(XMLCh)
  -    );//new XMLCh[end - start + 1];
  -    ArrayJanitor<XMLCh>  jname(strToScan, fMemoryManager);
  -    XMLString::subString(strToScan, fBuffer, start, end);
  +        if (fBuffer[i] < chDigit_0 || fBuffer[i] > chDigit_9)
  +            break;
   
  -    unsigned int retVal;
  -    XMLString::textToBin(strToScan, retVal);
  +        retVal = (retVal * 10) + (unsigned int) (fBuffer[i] - chDigit_0);
  +    }
   
  -    return (int) retVal;
  +    return (int) retVal;;
   }
   
   //
  
  
  
  1.9       +28 -14    xml-xerces/c/src/xercesc/util/XMLDateTime.hpp
  
  Index: XMLDateTime.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/XMLDateTime.hpp,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- XMLDateTime.hpp	18 May 2003 14:02:05 -0000	1.8
  +++ XMLDateTime.hpp	14 Aug 2003 02:57:27 -0000	1.9
  @@ -57,6 +57,9 @@
   /*
    * $Id$
    * $Log$
  + * Revision 1.9  2003/08/14 02:57:27  knoaman
  + * Code refactoring to improve performance of validation.
  + *
    * Revision 1.8  2003/05/18 14:02:05  knoaman
    * Memory manager implementation: pass per instance manager.
    *
  @@ -313,6 +316,7 @@
       int          fTimeZone[TIMEZONE_ARRAYSIZE];
       int          fStart;
       int          fEnd;
  +    int          fBufferMaxLen;
       XMLCh*       fBuffer;
       MemoryManager* fMemoryManager;
   };
  @@ -320,8 +324,19 @@
   inline void XMLDateTime::setBuffer(const XMLCh* const aString)
   {
       reset();
  -    fBuffer = XMLString::replicate(aString, fMemoryManager);
  -    fEnd    = XMLString::stringLen(fBuffer);
  +
  +    fEnd = XMLString::stringLen(aString);
  +    if (fEnd > 0) {
  +    
  +        if (fEnd > fBufferMaxLen)
  +        {
  +            fMemoryManager->deallocate(fBuffer);
  +            fBufferMaxLen = fEnd + 8;
  +            fBuffer = (XMLCh*) fMemoryManager->allocate((fBufferMaxLen+1) * sizeof(XMLCh));
  +        }
  +
  +        memcpy(fBuffer, aString, (fEnd+1) * sizeof(XMLCh));
  +    }
   }
   
   inline void XMLDateTime::reset()
  @@ -333,11 +348,7 @@
       fStart = fEnd = 0;
   
       if (fBuffer)
  -    {
  -        fMemoryManager->deallocate(fBuffer);//delete[] fBuffer;
  -        fBuffer = 0;
  -    }
  -
  +        *fBuffer = 0;
   }
   
   inline void XMLDateTime::copy(const XMLDateTime& rhs)
  @@ -350,14 +361,17 @@
       fStart = rhs.fStart;
       fEnd   = rhs.fEnd;
   
  -    if (fBuffer)
  +    if (fEnd > 0)
       {
  -        fMemoryManager->deallocate(fBuffer);//delete[] fBuffer;
  -        fBuffer = 0;
  -    }
  +        if (fEnd > fBufferMaxLen)
  +        {
  +            fMemoryManager->deallocate(fBuffer);//delete[] fBuffer;
  +            fBufferMaxLen = rhs.fBufferMaxLen;
  +            fBuffer = (XMLCh*) fMemoryManager->allocate((fBufferMaxLen+1) * sizeof(XMLCh));
  +        }
   
  -    if (rhs.fBuffer)
  -        fBuffer = XMLString::replicate(rhs.fBuffer, fMemoryManager);
  +        memcpy(fBuffer, rhs.fBuffer, (fEnd+1) * sizeof(XMLCh));
  +    }
   }
   
   inline void XMLDateTime::assertBuffer() const
  
  
  
  1.8       +285 -15   xml-xerces/c/src/xercesc/util/XMLURL.cpp
  
  Index: XMLURL.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/XMLURL.cpp,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- XMLURL.cpp	16 May 2003 06:01:53 -0000	1.7
  +++ XMLURL.cpp	14 Aug 2003 02:57:27 -0000	1.8
  @@ -135,6 +135,12 @@
   // !!! Keep these up to date with list above!
   static const unsigned int gMaxProtoLen = 4;
   
  +static const XMLCh gListOne[]    = { chColon, chForwardSlash, chNull };
  +static const XMLCh gListTwo[]    = { chAt, chNull };
  +static const XMLCh gListThree[]  = { chColon, chNull };
  +static const XMLCh gListFour[]   = { chForwardSlash, chNull };
  +static const XMLCh gListFive[]   = { chPound, chQuestion, chNull };
  +static const XMLCh gListSix[]    = { chPound, chNull };
   
   // ---------------------------------------------------------------------------
   //  Local methods
  @@ -926,13 +932,7 @@
       //  If the : is first, we assume we have a protocol. If the / is first,
       //  then we skip to the host processing.
       //
  -    static const XMLCh listOne[]    = { chColon, chForwardSlash, chNull };
  -    static const XMLCh listTwo[]    = { chAt, chNull };
  -    static const XMLCh listThree[]  = { chColon, chNull };
  -    static const XMLCh listFour[]   = { chForwardSlash, chNull };
  -    static const XMLCh listFive[]   = { chPound, chQuestion, chNull };
  -    static const XMLCh listSix[]    = { chPound, chNull };
  -    XMLCh* ptr1 = XMLString::findAny(srcPtr, listOne);
  +    XMLCh* ptr1 = XMLString::findAny(srcPtr, gListOne);
       XMLCh* ptr2;
   
       // If we found a protocol, then deal with it
  @@ -978,7 +978,7 @@
           if (*srcPtr)
           {
               // Search from here for a / character
  -            ptr1 = XMLString::findAny(srcPtr, listFour);
  +            ptr1 = XMLString::findAny(srcPtr, gListFour);
   
               //
               //  If we found something, then the host is between where
  @@ -1036,7 +1036,7 @@
           //  find one, then everything between the start of the host data
           //  and the character is the user name.
           //
  -        ptr1 = XMLString::findAny(fHost, listTwo);
  +        ptr1 = XMLString::findAny(fHost, gListTwo);
           if (ptr1)
           {
               // Get this info out as the user name
  @@ -1049,7 +1049,7 @@
               XMLString::cut(fHost, ptr1 - fHost);
   
               // Is there a password inside the user string?
  -            ptr2 = XMLString::findAny(fUser, listThree);
  +            ptr2 = XMLString::findAny(fUser, gListThree);
               if (ptr2)
               {
                   // Remove it from the user name string
  @@ -1067,7 +1067,7 @@
           //  not at the end of the host data, then lets see if we have a
           //  port trailing the
           //
  -        ptr1 = XMLString::findAny(fHost, listThree);
  +        ptr1 = XMLString::findAny(fHost, gListThree);
           if (ptr1)
           {
               // Remove it from the host name
  @@ -1082,7 +1082,7 @@
           // If the host ended up empty, then toss is
           if (!*fHost)
           {
  -            delete[] fHost;
  +            fMemoryManager->deallocate(fHost);//delete[] fHost;
               fHost = 0;
           }
       }
  @@ -1098,7 +1098,7 @@
       //  forward slash character, or relative. Its basically everything up
       //  to the end of the string or to any trailing query or fragment.
       //
  -    ptr1 = XMLString::findAny(srcPtr, listFive);
  +    ptr1 = XMLString::findAny(srcPtr, gListFive);
       if (!ptr1)
       {
           fMemoryManager->deallocate(fPath);//delete [] fPath;
  @@ -1137,7 +1137,7 @@
       //  separator.
       //
       srcPtr++;
  -    ptr1 = XMLString::findAny(srcPtr, listSix);
  +    ptr1 = XMLString::findAny(srcPtr, gListSix);
       fMemoryManager->deallocate(fQuery);//delete [] fQuery;
       if (!ptr1)
       {
  @@ -1165,6 +1165,276 @@
       }
   }
   
  +bool XMLURL::parse(const XMLCh* const urlText, XMLURL& xmlURL)
  +{
  +    // Simplify things by checking for the psycho scenarios first
  +    if (!*urlText)
  +        return false;
  +
  +    // Before we start, check if this urlText contains valid uri characters
  +    if (!XMLUri::isURIString(urlText))
  +        xmlURL.fHasInvalidChar = true;
  +    else
  +        xmlURL.fHasInvalidChar = false;
  +
  +    //
  +    //  The first thing we will do is to check for a file name, so that
  +    //  we don't waste time thinking its a URL. If its in the form x:\
  +    //  or x:/ and x is an ASCII letter, then assume that's the deal.
  +    //
  +    if (((*urlText >= chLatin_A) && (*urlText <= chLatin_Z))
  +    ||  ((*urlText >= chLatin_a) && (*urlText <= chLatin_z)))
  +    {
  +        if (*(urlText + 1) == chColon)
  +        {
  +            if ((*(urlText + 2) == chForwardSlash)
  +            ||  (*(urlText + 2) == chBackSlash))
  +            {
  +                return false;
  +            }
  +        }
  +    }
  +
  +    // Get a copy of the URL that we can modify
  +    XMLCh* srcCpy = XMLString::replicate(urlText, xmlURL.fMemoryManager);
  +    ArrayJanitor<XMLCh> janSrcCopy(srcCpy, xmlURL.fMemoryManager);
  +
  +    //
  +    //  Get a pointer now that we can run up thrown the source as we parse
  +    //  bits and pieces out of it.
  +    //
  +    XMLCh* srcPtr = srcCpy;
  +
  +    // Run up past any spaces
  +    while (*srcPtr)
  +    {
  +        if (!XMLPlatformUtils::fgTransService->isSpace(*srcPtr))
  +            break;
  +        srcPtr++;
  +    }
  +
  +    // Make sure it wasn't all space
  +    if (!*srcPtr)
  +        return false;
  +
  +    //
  +    //  Ok, the next thing we have to do is to find either a / or : character.
  +    //  If the : is first, we assume we have a protocol. If the / is first,
  +    //  then we skip to the host processing.
  +    //
  +    XMLCh* ptr1 = XMLString::findAny(srcPtr, gListOne);
  +    XMLCh* ptr2;
  +
  +    // If we found a protocol, then deal with it
  +    if (ptr1)
  +    {
  +        if (*ptr1 == chColon)
  +        {
  +            // Cap the string at the colon
  +            *ptr1 = 0;
  +
  +            // And try to find it in our list of protocols
  +            xmlURL.fProtocol = lookupByName(srcPtr);
  +
  +            if (xmlURL.fProtocol == Unknown)
  +                return false;
  +
  +            // And move our source pointer up past what we've processed
  +            srcPtr = (ptr1 + 1);
  +        }
  +    }
  +
  +    //
  +    //  Ok, next we need to see if we have any host part. If the next
  +    //  two characters are //, then we need to check, else move on.
  +    //
  +    if ((*srcPtr == chForwardSlash) && (*(srcPtr + 1) == chForwardSlash))
  +    {
  +        // Move up past the slashes
  +        srcPtr += 2;
  +
  +        //
  +        //  If we aren't at the end of the string, then there has to be a
  +        //  host part at this point. we will just look for the next / char
  +        //  or end of string and make all of that the host for now.
  +        //
  +        if (*srcPtr)
  +        {
  +            // Search from here for a / character
  +            ptr1 = XMLString::findAny(srcPtr, gListFour);
  +
  +            //
  +            //  If we found something, then the host is between where
  +            //  we are and what we found. Else the host is the rest of
  +            //  the content and we are done. If its empty, leave it null.
  +            //
  +            if (ptr1)
  +            {
  +                if (ptr1 != srcPtr)
  +                {
  +                    xmlURL.fHost = (XMLCh*) xmlURL.fMemoryManager->allocate
  +                    (
  +                        (ptr1 - srcPtr + 1) * sizeof(XMLCh)
  +                    );//new XMLCh[(ptr1 - srcPtr) + 1];
  +                    ptr2 = xmlURL.fHost;
  +                    while (srcPtr < ptr1)
  +                        *ptr2++ = *srcPtr++;
  +                    *ptr2 = 0;
  +                }
  +            }
  +             else
  +            {
  +                xmlURL.fHost = XMLString::replicate(srcPtr, xmlURL.fMemoryManager);
  +
  +                // Update source pointer to the end
  +                srcPtr += XMLString::stringLen(xmlURL.fHost);
  +            }
  +        }
  +    }
  +    else
  +    {
  +        //
  +        // http protocol requires two forward slashes
  +        // we didn't get them, so throw an exception
  +        //
  +        if (xmlURL.fProtocol == HTTP)
  +            return false;
  +    }
  +
  +    //
  +    //  If there was a host part, then we have to grovel through it for
  +    //  all the bits and pieces it can hold.
  +    //
  +    if (xmlURL.fHost)
  +    {
  +        //
  +        //  Look for a '@' character, which indicates a user name. If we
  +        //  find one, then everything between the start of the host data
  +        //  and the character is the user name.
  +        //
  +        ptr1 = XMLString::findAny(xmlURL.fHost, gListTwo);
  +        if (ptr1)
  +        {
  +            // Get this info out as the user name
  +            *ptr1 = 0;
  +            xmlURL.fUser = XMLString::replicate(xmlURL.fHost, xmlURL.fMemoryManager);
  +            ptr1++;
  +
  +            // And now cut these chars from the host string
  +            XMLString::cut(xmlURL.fHost, ptr1 - xmlURL.fHost);
  +
  +            // Is there a password inside the user string?
  +            ptr2 = XMLString::findAny(xmlURL.fUser, gListThree);
  +            if (ptr2)
  +            {
  +                // Remove it from the user name string
  +                *ptr2 = 0;
  +
  +                // And copy out the remainder to the password field
  +                ptr2++;
  +                xmlURL.fPassword = XMLString::replicate(ptr2, xmlURL.fMemoryManager);
  +            }
  +        }
  +
  +        //
  +        //  Ok, so now we are at the actual host name, if any. If we are
  +        //  not at the end of the host data, then lets see if we have a
  +        //  port trailing the
  +        //
  +        ptr1 = XMLString::findAny(xmlURL.fHost, gListThree);
  +        if (ptr1)
  +        {
  +            // Remove it from the host name
  +            *ptr1 = 0;
  +
  +            // Try to convert it to a numeric port value and store it
  +            ptr1++;
  +            if (!XMLString::textToBin(ptr1, xmlURL.fPortNum))
  +                return false;
  +        }
  +
  +        // If the host ended up empty, then toss is
  +        if (!*(xmlURL.fHost))
  +        {
  +            xmlURL.fMemoryManager->deallocate(xmlURL.fHost);//delete[] fHost;
  +            xmlURL.fHost = 0;
  +        }
  +    }
  +
  +    // If we are at the end, then we are done now
  +    if (!*srcPtr)
  +	{
  +        return true;
  +	}
  +
  +    //
  +    //  Next is the path part. It can be absolute, i.e. starting with a
  +    //  forward slash character, or relative. Its basically everything up
  +    //  to the end of the string or to any trailing query or fragment.
  +    //
  +    ptr1 = XMLString::findAny(srcPtr, gListFive);
  +    if (!ptr1)
  +    {
  +        xmlURL.fPath = XMLString::replicate(srcPtr, xmlURL.fMemoryManager);
  +        return true;
  +    }
  +
  +    // Everything from where we are to what we found is the path
  +    if (ptr1 > srcPtr)
  +    {
  +        xmlURL.fPath = (XMLCh*) xmlURL.fMemoryManager->allocate
  +        (
  +            (ptr1 - srcPtr + 1) * sizeof(XMLCh)
  +        );//new XMLCh[(ptr1 - srcPtr) + 1];
  +        ptr2 = xmlURL.fPath;
  +        while (srcPtr < ptr1)
  +            *ptr2++ = *srcPtr++;
  +        *ptr2 = 0;
  +    }
  +
  +    //
  +    //  If we found a fragment, then it is the rest of the string and we
  +    //  are done.
  +    //
  +    if (*srcPtr == chPound)
  +    {
  +        srcPtr++;
  +        xmlURL.fFragment = XMLString::replicate(srcPtr, xmlURL.fMemoryManager);
  +        return true;
  +    }
  +
  +    //
  +    //  The query is either the rest of the string, or up to the fragment
  +    //  separator.
  +    //
  +    srcPtr++;
  +    ptr1 = XMLString::findAny(srcPtr, gListSix);
  +    if (!ptr1)
  +    {
  +        xmlURL.fQuery = XMLString::replicate(srcPtr, xmlURL.fMemoryManager);
  +        return true;
  +    }
  +     else
  +    {
  +        xmlURL.fQuery = (XMLCh*) xmlURL.fMemoryManager->allocate
  +        (
  +            (ptr1 - srcPtr + 1) * sizeof(XMLCh)
  +        );//new XMLCh[(ptr1 - srcPtr) + 1];
  +        ptr2 = xmlURL.fQuery;
  +        while (srcPtr < ptr1)
  +            *ptr2++ = *srcPtr++;
  +        *ptr2 = 0;
  +    }
  +
  +    // If we are not at the end now, then everything else is the fragment
  +    if (*srcPtr == chPound)
  +    {
  +        srcPtr++;
  +        xmlURL.fFragment = XMLString::replicate(srcPtr, xmlURL.fMemoryManager);
  +    }
  +
  +    return true;
  +}
   
   XERCES_CPP_NAMESPACE_END
   
  
  
  
  1.10      +2 -2      xml-xerces/c/src/xercesc/util/XMLURL.hpp
  
  Index: XMLURL.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/XMLURL.hpp,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- XMLURL.hpp	18 May 2003 14:02:05 -0000	1.9
  +++ XMLURL.hpp	14 Aug 2003 02:57:27 -0000	1.10
  @@ -95,7 +95,7 @@
       //  Public static methods
       // -----------------------------------------------------------------------
       static Protocols lookupByName(const XMLCh* const protoName);
  -
  +    static bool parse(const XMLCh* urlText, XMLURL& xmlURL);
   
       // -----------------------------------------------------------------------
       //  Constructors and Destructor
  
  
  
  1.14      +21 -7     xml-xerces/c/src/xercesc/util/regx/RegularExpression.cpp
  
  Index: RegularExpression.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/regx/RegularExpression.cpp,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- RegularExpression.cpp	25 May 2003 21:42:41 -0000	1.13
  +++ RegularExpression.cpp	14 Aug 2003 02:57:27 -0000	1.14
  @@ -56,6 +56,9 @@
   
   /*
    * $Log$
  + * Revision 1.14  2003/08/14 02:57:27  knoaman
  + * Code refactoring to improve performance of validation.
  + *
    * Revision 1.13  2003/05/25 21:42:41  knoaman
    * Allocate/Deallocate Context::xxx only when necessary.
    *
  @@ -171,6 +174,7 @@
   	, fLimit(0)
   	, fLength(0)
   	, fSize(0)
  +    , fStringMaxLen(0)
   	, fOffsets(0)
   	, fMatch(0)
   	, fString(0)
  @@ -193,13 +197,24 @@
   //  RegularExpression::Context: Public methods
   // ---------------------------------------------------------------------------
   void RegularExpression::Context::reset(const XMLCh* const string
  -                                       , const int start, const int limit
  +                                       , const int stringLen
  +                                       , const int start
  +                                       , const int limit
                                          , const int noClosures)
   {
  -    if (fString)
  -        fMemoryManager->deallocate(fString);//delete [] fString;
  +    if (stringLen > fStringMaxLen || !fString) {
  +
  +        fStringMaxLen = stringLen;
  +
  +        if (fString)
  +            fMemoryManager->deallocate(fString);
  +
  +        fString = XMLString::replicate(string, fMemoryManager);
  +    }
  +    else {
  +        memcpy(fString, string, (stringLen + 1) * sizeof(XMLCh));
  +    }
   
  -    fString = XMLString::replicate(string, fMemoryManager);
   	fStart = start;
   	fLimit = limit;
   	fLength = fLimit - fStart;
  @@ -208,7 +223,6 @@
   		delete fMatch;
   	fMatch = 0;
   
  -
   	if (fSize != noClosures) {
   
   		if (fOffsets)
  @@ -490,7 +504,7 @@
   			context = fContext;
   		}
   
  -		context->reset(expression, start, end, fNoClosures);
  +		context->reset(expression, strLength, start, end, fNoClosures);
   	}
   
   	Janitor<Context> janContext(tmpContext);
  @@ -728,7 +742,7 @@
    	     context = fContext;
    	   }
   
  - 	   context->reset(expression, start, end, fNoClosures);
  + 	   context->reset(expression, strLength, start, end, fNoClosures);
     }
   
     Janitor<Context> janContext(tmpContext);
  
  
  
  1.11      +5 -4      xml-xerces/c/src/xercesc/util/regx/RegularExpression.hpp
  
  Index: RegularExpression.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/regx/RegularExpression.hpp,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- RegularExpression.hpp	22 May 2003 02:10:52 -0000	1.10
  +++ RegularExpression.hpp	14 Aug 2003 02:57:27 -0000	1.11
  @@ -190,16 +190,17 @@
               ~Context();
   
               inline const XMLCh* getString() const { return fString; }
  -            void reset(const XMLCh* const string, const int start,
  -                       const int limit, const int noClosures);
  +            void reset(const XMLCh* const string, const int stringLen,
  +                       const int start, const int limit, const int noClosures);
               bool nextCh(XMLInt32& ch, int& offset, const short direction);
   
               bool      fInUse;
               bool      fAdoptMatch;
               int       fStart;
               int       fLimit;
  -            int       fLength;
  +            int       fLength;    // fLimit - fStart
               int       fSize;
  +            int       fStringMaxLen;
               int*      fOffsets;
               Match*    fMatch;
               XMLCh*    fString;
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org