tng         2002/07/22 16:23:15

  Modified:    c/src/xercesc/framework MemBufFormatTarget.cpp
                        MemBufFormatTarget.hpp
  Log:
  DOM L3: MemBufFormatTarget stores fDataBuf as XMLByte directly, consistent design as 
MemBufInputSource
  
  Revision  Changes    Path
  1.3       +59 -15    xml-xerces/c/src/xercesc/framework/MemBufFormatTarget.cpp
  
  Index: MemBufFormatTarget.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/framework/MemBufFormatTarget.cpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- MemBufFormatTarget.cpp    5 Jun 2002 15:47:13 -0000       1.2
  +++ MemBufFormatTarget.cpp    22 Jul 2002 23:23:15 -0000      1.3
  @@ -57,6 +57,9 @@
   /*
    * $Id$
    * $Log$
  + * Revision 1.3  2002/07/22 23:23:15  tng
  + * DOM L3: MemBufFormatTarget stores fDataBuf as XMLByte directly, consistent 
design as MemBufInputSource
  + *
    * Revision 1.2  2002/06/05 15:47:13  peiyongz
    * data member changed, reset() added.
    *
  @@ -67,42 +70,83 @@
   
   #include <xercesc/framework/MemBufFormatTarget.hpp>
   #include <xercesc/util/XMLString.hpp>
  +#include <string.h>
   
  -MemBufFormatTarget::MemBufFormatTarget()
  +MemBufFormatTarget::MemBufFormatTarget(int capacity)
  +    : fDataBuf(0)
  +    , fIndex(0)
  +    , fCapacity(capacity)
   {
  +    // Buffer is one larger than capacity, to allow for zero term
  +    fDataBuf = new XMLByte[fCapacity+4];
  +
  +    // Keep it null terminated
  +    fDataBuf[0] = XMLByte(0);
   }
   
   MemBufFormatTarget::~MemBufFormatTarget()
   {
  +    delete [] fDataBuf;
   }
   
   void MemBufFormatTarget::writeChars(const XMLByte* const toWrite
                                     , const unsigned int   count
                                     , XMLFormatter * const formatter)
   {
  -     //
  -     // The toWrite may not be null terminated,
  -     // so we need to do some extra work here
  -     //
  -     XMLByte  lastChar = toWrite[count];   // preserve the last char
  -     XMLByte* tmpBuf   = (XMLByte *)toWrite;
  +    //
  +    // The toWrite may not be null terminated,
  +    // so we need to do some extra work here
  +    //
  +    XMLByte  lastChar = toWrite[count];   // preserve the last char
  +    XMLByte* tmpBuf   = (XMLByte *)toWrite;
       tmpBuf[count] = 0;
   
  -     XMLCh*   transBuf = XMLString::transcode((char *) tmpBuf);
  -     fDataBuf.append(transBuf, XMLString::stringLen(transBuf));
  -     delete[] transBuf;
  +    if (count) {
  +        insureCapacity(count);
  +        memcpy(&fDataBuf[fIndex], toWrite, count * sizeof(XMLByte));
  +        fIndex += count;
  +    }
   
  -     tmpBuf[count] = lastChar;             // restore the last char
  +    tmpBuf[count] = lastChar;             // restore the last char
   }
   
  -XMLCh* MemBufFormatTarget::getString() const
  +const XMLByte* MemBufFormatTarget::getRawBuffer() const
   {
  -     return XMLString::replicate(fDataBuf.getRawBuffer());
  +    fDataBuf[fIndex] = 0;
  +    fDataBuf[fIndex + 1] = 0;
  +    fDataBuf[fIndex + 2] = 0;
  +    fDataBuf[fIndex + 3] = 0;
  +    return fDataBuf;
   }
   
   void MemBufFormatTarget::reset()
   {
  -    fDataBuf.reset();
  +    fIndex = 0;
  +    fDataBuf[0] = 0;
  +    fDataBuf[fIndex + 1] = 0;
  +    fDataBuf[fIndex + 2] = 0;
  +    fDataBuf[fIndex + 3] = 0;
   }
   
  +// ---------------------------------------------------------------------------
  +//  MemBufFormatTarget: Private helper methods
  +// ---------------------------------------------------------------------------
  +void MemBufFormatTarget::insureCapacity(const unsigned int extraNeeded)
  +{
  +    // If we can handle it, do nothing yet
  +    if (fIndex + extraNeeded < fCapacity)
  +        return;
  +
  +    // Oops, not enough room. Calc new capacity and allocate new buffer
  +    const unsigned int newCap = (unsigned int)((fIndex + extraNeeded) * 1.25);
  +    XMLByte* newBuf = new XMLByte[newCap+4];
  +
  +    // Copy over the old stuff
  +    memcpy(newBuf, fDataBuf, fCapacity * sizeof(XMLByte) + 4);
  +
  +    // Clean up old buffer and store new stuff
  +    delete [] fDataBuf;
  +    fDataBuf = newBuf;
  +    fCapacity = newCap;
  +}
   
  
  
  
  1.3       +48 -9     xml-xerces/c/src/xercesc/framework/MemBufFormatTarget.hpp
  
  Index: MemBufFormatTarget.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/framework/MemBufFormatTarget.hpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- MemBufFormatTarget.hpp    5 Jun 2002 15:47:13 -0000       1.2
  +++ MemBufFormatTarget.hpp    22 Jul 2002 23:23:15 -0000      1.3
  @@ -57,6 +57,9 @@
   /*
    * $Id$
    * $Log$
  + * Revision 1.3  2002/07/22 23:23:15  tng
  + * DOM L3: MemBufFormatTarget stores fDataBuf as XMLByte directly, consistent 
design as MemBufInputSource
  + *
    * Revision 1.2  2002/06/05 15:47:13  peiyongz
    * data member changed, reset() added.
    *
  @@ -69,14 +72,13 @@
   #define MemBufFormatTarget_HEADER_GUARD_
   
   #include <xercesc/framework/XMLFormatter.hpp>
  -#include <xercesc/framework/XMLBuffer.hpp>
   
   class XMLPARSER_EXPORT MemBufFormatTarget : public XMLFormatTarget {
   public:
   
       /** @name constructors and destructor */
       //@{
  -    MemBufFormatTarget() ;
  +    MemBufFormatTarget(int capacity = 1023) ;
       ~MemBufFormatTarget();
       //@}
   
  @@ -90,16 +92,30 @@
       // -----------------------------------------------------------------------
       //  Getter
       // -----------------------------------------------------------------------
  -    /** @name getString */
  +    /** @name getRawBuffer */
       //@{
       /**
  -     * Returned the internal string buffer.
  +     * Returned the internal raw buffer.
        *
  -     * Caller owns the returned string and is accountable
  -     * for the memory release
  +     * The MemBufFormatTarget object owns the buffer which will be deleted when
  +     * MemBufFormatTarget is destructed; or will be reset when the reset() function
  +     * is called.  User should make a copy of the returned buffer if intend to keep
  +     * it independent on the state of the MemBufFormatTarget.
        */
  -    XMLCh* getString() const;
       //@}
  +    const XMLByte* getRawBuffer() const;
  +
  +    /** @name getLen */
  +    //@{
  +    /**
  +     * Returned the length of the raw buffer.
  +     *
  +     */
  +    //@}
  +    unsigned int getLen() const
  +    {
  +        return fIndex;
  +    }
   
       /** @name reset */
       //@{
  @@ -117,7 +133,30 @@
       MemBufFormatTarget(const MemBufFormatTarget&);
       MemBufFormatTarget& operator=(const MemBufFormatTarget&);
   
  -    XMLBuffer     fDataBuf;
  +    // -----------------------------------------------------------------------
  +    //  Private helpers
  +    // -----------------------------------------------------------------------
  +    void insureCapacity(const unsigned int extraNeeded);
  +
  +    // -----------------------------------------------------------------------
  +    //  Private data members
  +    //
  +    //  fDataBuf
  +    //      The pointer to the buffer data. Its grown as needed. Its always
  +    //      one larger than fCapacity, to leave room for the null terminator.
  +    //
  +    //  fIndex
  +    //      The current index into the buffer, as characters are appended
  +    //      to it. If its zero, then the buffer is empty.
  +    //
  +    //  fCapacity
  +    //      The current capacity of the buffer. Its actually always one
  +    //      larger, to leave room for the null terminator.
  +    //
  +    // -----------------------------------------------------------------------
  +    XMLByte*        fDataBuf;
  +    unsigned int    fIndex;
  +    unsigned int    fCapacity;
   
   };
   
  
  
  

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

Reply via email to