diff --git a/src/xercesc/internal/BinMemOutputStream.cpp b/src/xercesc/internal/BinMemOutputStream.cpp new file mode 100644 index 0000000000000000000000000000000000000000..720fc8fb370a8e3238f5781a370c68200350154b --- /dev/null +++ b/src/xercesc/internal/BinMemOutputStream.cpp @@ -0,0 +1,158 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2003 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Xerces" and "Apache Software Foundation" must + * not be used to endorse or promote products derived from this + * software without prior written permission. For written + * permission, please contact apache\@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * nor may "Apache" appear in their name, without prior written + * permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation, and was + * originally based on software copyright (c) 1999, International + * Business Machines, Inc., http://www.ibm.com . For more information + * on the Apache Software Foundation, please see + * <http://www.apache.org/>. + */ + +/* + * $Id$ + * $Log$ + * Revision 1.1 2003/12/16 16:56:51 peiyongz + * BinMemOutputStream + * + * + */ + +#include <xercesc/internal/BinMemOutputStream.hpp> +#include <xercesc/util/XMLString.hpp> +#include <string.h> + +XERCES_CPP_NAMESPACE_BEGIN + +BinMemOutputStream::BinMemOutputStream( int initCapacity + , MemoryManager* const manager) +: fMemoryManager(manager) +, fDataBuf(0) +, fIndex(0) +, fCapacity(initCapacity) +{ + // Buffer is one larger than capacity, to allow for zero term + fDataBuf = (XMLByte*) fMemoryManager->allocate + ( + (fCapacity + 4) * sizeof(XMLByte) + ); + + // Keep it null terminated + fDataBuf[0] = XMLByte(0); +} + +BinMemOutputStream::~BinMemOutputStream() +{ + fMemoryManager->deallocate(fDataBuf); +} + +void BinMemOutputStream::writeBytes( XMLByte* const toGo + , const unsigned int maxToWrite) +{ + + if (maxToWrite) + { + insureCapacity(maxToWrite); + memcpy(&fDataBuf[fIndex], toGo, maxToWrite * sizeof(XMLByte)); + fIndex += maxToWrite; + } + +} + +const XMLByte* BinMemOutputStream::getRawBuffer() const +{ + fDataBuf[fIndex] = 0; + fDataBuf[fIndex + 1] = 0; + fDataBuf[fIndex + 2] = 0; + fDataBuf[fIndex + 3] = 0; + return fDataBuf; +} + +void BinMemOutputStream::reset() +{ + fIndex = 0; + + for (int i = 0; i < 4; i++) + { + fDataBuf[fIndex + i] = 0; + } +} + +unsigned int BinMemOutputStream::curPos() const +{ + return fIndex; +} + +// --------------------------------------------------------------------------- +// BinMemOutputStream: Private helper methods +// --------------------------------------------------------------------------- +void BinMemOutputStream::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) * 2); + XMLByte* newBuf = (XMLByte*) fMemoryManager->allocate + ( + (newCap+4) * sizeof(XMLByte) + ); + + // Copy over the old stuff + memcpy(newBuf, fDataBuf, fCapacity * sizeof(XMLByte) + 4); + + // Clean up old buffer and store new stuff + fMemoryManager->deallocate(fDataBuf); + fDataBuf = newBuf; + fCapacity = newCap; +} + + +XERCES_CPP_NAMESPACE_END + diff --git a/src/xercesc/internal/BinMemOutputStream.hpp b/src/xercesc/internal/BinMemOutputStream.hpp new file mode 100644 index 0000000000000000000000000000000000000000..1e25f17deeedfa0628aa7445cc55488675c456b3 --- /dev/null +++ b/src/xercesc/internal/BinMemOutputStream.hpp @@ -0,0 +1,147 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2003 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Xerces" and "Apache Software Foundation" must + * not be used to endorse or promote products derived from this + * software without prior written permission. For written + * permission, please contact apache\@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * nor may "Apache" appear in their name, without prior written + * permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation, and was + * originally based on software copyright (c) 1999, International + * Business Machines, Inc., http://www.ibm.com . For more information + * on the Apache Software Foundation, please see + * <http://www.apache.org/>. + */ + +/* + * $Id$ + * $Log$ + * Revision 1.1 2003/12/16 16:56:51 peiyongz + * BinMemOutputStream + * + * + */ + +#ifndef BINMEMOUTPUTSTREAM_HEADER_GUARD_ +#define BINMEMOUTPUTSTREAM_HEADER_GUARD_ + +#include <xercesc/framework/BinOutputStream.hpp> +#include <xercesc/util/PlatformUtils.hpp> + +XERCES_CPP_NAMESPACE_BEGIN + +class XMLUTIL_EXPORT BinMemOutputStream : public BinOutputStream +{ +public : + // ----------------------------------------------------------------------- + // Constructors and Destructor + // ----------------------------------------------------------------------- + + ~BinMemOutputStream(); + + BinMemOutputStream + ( + int initCapacity = 1023 + , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager + ); + + // ----------------------------------------------------------------------- + // Implementation of the output stream interface + // ----------------------------------------------------------------------- + virtual unsigned int curPos() const; + + virtual void writeBytes + ( + XMLByte* const toGo + , const unsigned int maxToWrite + ) ; + + // ----------------------------------------------------------------------- + // Getter methods + // ----------------------------------------------------------------------- + const XMLByte* getRawBuffer() const; + + unsigned int getSize() const; + void reset(); + +private : + // ----------------------------------------------------------------------- + // Unimplemented methods. + // ----------------------------------------------------------------------- + BinMemOutputStream(const BinMemOutputStream&); + BinMemOutputStream& operator=(const BinMemOutputStream&); + + // ----------------------------------------------------------------------- + // 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. + // + // ----------------------------------------------------------------------- + MemoryManager* fMemoryManager; + XMLByte* fDataBuf; + unsigned int fIndex; + unsigned int fCapacity; + +}; + + +XERCES_CPP_NAMESPACE_END + +#endif +