From fedcd46cf8a29dd78806d042f2c5683dd309d6b0 Mon Sep 17 00:00:00 2001
From: Khaled Noaman <knoaman@apache.org>
Date: Thu, 15 May 2003 18:59:34 +0000
Subject: [PATCH] Partial implementation of the configurable memory manager.

git-svn-id: https://svn.apache.org/repos/asf/xerces/c/trunk@174983 13f79535-47bb-0310-9956-ffa450edef68
---
 .../Transcoders/Cygwin/CygwinTransService.cpp |  69 +++++-
 .../Transcoders/Cygwin/CygwinTransService.hpp |   5 +
 .../util/Transcoders/ICU/ICUTransService.cpp  |   5 +-
 .../util/Transcoders/ICU/ICUTransService.hpp  |   8 +
 .../Transcoders/Iconv/IconvTransService.cpp   | 105 +++++++-
 .../Transcoders/Iconv/IconvTransService.hpp   |   8 +
 .../Iconv390/Iconv390TransService.cpp         |  83 ++++++-
 .../Iconv390/Iconv390TransService.hpp         |   8 +
 .../Iconv400/Iconv400TransService.cpp         | 147 +++++++++++-
 .../Iconv400/Iconv400TransService.hpp         |   5 +
 .../IconvFBSD/IconvFBSDTransService.cpp       |  14 +-
 .../IconvFBSD/IconvFBSDTransService.hpp       |   8 +
 .../IconvGNU/IconvGNUTransService.cpp         |  14 +-
 .../IconvGNU/IconvGNUTransService.hpp         |   8 +
 .../MacOSUnicodeConverter.cpp                 |   5 +-
 .../MacOSUnicodeConverter.hpp                 |   5 +
 .../Uniconv390/Uniconv390TransService.cpp     | 105 +++++++-
 .../Uniconv390/Uniconv390TransService.hpp     |   5 +
 .../Transcoders/Win32/Win32TransService.cpp   |  67 +++++-
 .../Transcoders/Win32/Win32TransService.hpp   |   8 +
 src/xercesc/util/regx/BMPattern.cpp           |  65 +++--
 src/xercesc/util/regx/BMPattern.hpp           |  48 ++--
 src/xercesc/util/regx/Match.hpp               |   3 +-
 src/xercesc/util/regx/Op.hpp                  |   6 +-
 src/xercesc/util/regx/OpFactory.cpp           |  40 +--
 src/xercesc/util/regx/OpFactory.hpp           |   9 +-
 src/xercesc/util/regx/ParserForXMLSchema.cpp  |   8 +-
 src/xercesc/util/regx/ParserForXMLSchema.hpp  |   2 +-
 src/xercesc/util/regx/RangeFactory.hpp        |   8 +-
 src/xercesc/util/regx/RangeTokenMap.hpp       |  13 +-
 src/xercesc/util/regx/RegularExpression.cpp   |   6 +-
 src/xercesc/util/regx/RegularExpression.hpp   |  15 +-
 src/xercesc/util/regx/RegxParser.cpp          |  49 ++--
 src/xercesc/util/regx/RegxParser.hpp          |  10 +-
 src/xercesc/util/regx/RegxUtil.cpp            |  84 ++++---
 src/xercesc/util/regx/RegxUtil.hpp            |   7 +-
 src/xercesc/util/regx/Token.hpp               |   6 +-
 src/xercesc/util/regx/TokenFactory.hpp        |   7 +-
 src/xercesc/validators/DTD/DTDAttDef.cpp      |  13 +-
 src/xercesc/validators/DTD/DTDAttDef.hpp      |   4 +-
 src/xercesc/validators/DTD/DTDElementDecl.cpp |  53 ++--
 src/xercesc/validators/DTD/DTDElementDecl.hpp |  19 +-
 src/xercesc/validators/DTD/DTDGrammar.cpp     |  32 ++-
 src/xercesc/validators/DTD/DTDGrammar.hpp     |  18 +-
 src/xercesc/validators/DTD/DTDScanner.cpp     | 107 ++++++---
 src/xercesc/validators/DTD/DTDScanner.hpp     |  15 +-
 .../validators/common/AllContentModel.cpp     |  35 +--
 .../validators/common/AllContentModel.hpp     |  11 +-
 src/xercesc/validators/common/CMAny.cpp       |  12 +-
 src/xercesc/validators/common/CMAny.hpp       |  11 +-
 src/xercesc/validators/common/CMBinaryOp.cpp  |  12 +-
 src/xercesc/validators/common/CMBinaryOp.hpp  |  11 +-
 src/xercesc/validators/common/CMLeaf.hpp      |  54 +++--
 src/xercesc/validators/common/CMNode.hpp      |  38 ++-
 src/xercesc/validators/common/CMStateSet.hpp  |  21 +-
 src/xercesc/validators/common/CMUnaryOp.cpp   |  11 +-
 src/xercesc/validators/common/CMUnaryOp.hpp   |  11 +-
 .../common/ContentLeafNameTypeVector.cpp      |  36 ++-
 .../common/ContentLeafNameTypeVector.hpp      |  31 ++-
 .../validators/common/ContentSpecNode.cpp     |   9 +-
 .../validators/common/ContentSpecNode.hpp     |  26 +-
 .../validators/common/DFAContentModel.cpp     | 227 +++++++++++++-----
 .../validators/common/DFAContentModel.hpp     |  23 +-
 src/xercesc/validators/common/Grammar.hpp     |   5 +-
 .../validators/common/GrammarResolver.cpp     |  14 +-
 .../validators/common/GrammarResolver.hpp     |   8 +-
 .../validators/common/MixedContentModel.cpp   |  16 +-
 .../validators/common/MixedContentModel.hpp   |  15 +-
 .../validators/common/SimpleContentModel.hpp  |  26 +-
 .../AbstractNumericFacetValidator.cpp         |  10 +-
 .../AbstractNumericFacetValidator.hpp         |  15 +-
 .../datatype/AbstractNumericValidator.cpp     |   8 +-
 .../datatype/AbstractNumericValidator.hpp     |  18 +-
 .../datatype/AbstractStringValidator.cpp      |  15 +-
 .../datatype/AbstractStringValidator.hpp      |  15 +-
 .../AnySimpleTypeDatatypeValidator.cpp        |  21 +-
 .../AnySimpleTypeDatatypeValidator.hpp        |  15 +-
 .../datatype/AnyURIDatatypeValidator.cpp      |  17 +-
 .../datatype/AnyURIDatatypeValidator.hpp      |  36 ++-
 .../Base64BinaryDatatypeValidator.cpp         |  29 ++-
 .../Base64BinaryDatatypeValidator.hpp         |  36 ++-
 .../datatype/BooleanDatatypeValidator.cpp     |  12 +-
 .../datatype/BooleanDatatypeValidator.hpp     |  45 ++--
 .../validators/datatype/DatatypeValidator.cpp | 101 +++++++-
 .../validators/datatype/DatatypeValidator.hpp | 209 +++++++---------
 .../datatype/DatatypeValidatorFactory.cpp     |  91 ++++---
 .../datatype/DatatypeValidatorFactory.hpp     |  71 +++---
 .../datatype/DateDatatypeValidator.cpp        |  29 ++-
 .../datatype/DateDatatypeValidator.hpp        |  35 ++-
 .../datatype/DateTimeDatatypeValidator.cpp    |  29 ++-
 .../datatype/DateTimeDatatypeValidator.hpp    |  35 ++-
 .../validators/datatype/DateTimeValidator.cpp |  12 +-
 .../validators/datatype/DateTimeValidator.hpp |  15 +-
 .../datatype/DayDatatypeValidator.cpp         |  29 ++-
 .../datatype/DayDatatypeValidator.hpp         |  34 ++-
 .../datatype/DecimalDatatypeValidator.cpp     |  55 +++--
 .../datatype/DecimalDatatypeValidator.hpp     |  49 ++--
 .../datatype/DoubleDatatypeValidator.cpp      |  55 +++--
 .../datatype/DoubleDatatypeValidator.hpp      |  46 ++--
 .../datatype/DurationDatatypeValidator.cpp    |  29 ++-
 .../datatype/DurationDatatypeValidator.hpp    |  35 ++-
 .../datatype/ENTITYDatatypeValidator.cpp      |  27 ++-
 .../datatype/ENTITYDatatypeValidator.hpp      |  38 ++-
 .../datatype/FloatDatatypeValidator.cpp       |  54 +++--
 .../datatype/FloatDatatypeValidator.hpp       |  59 +++--
 .../datatype/HexBinaryDatatypeValidator.cpp   |  27 ++-
 .../datatype/HexBinaryDatatypeValidator.hpp   |  33 ++-
 .../datatype/IDDatatypeValidator.cpp          |  34 ++-
 .../datatype/IDDatatypeValidator.hpp          |  47 ++--
 .../datatype/IDREFDatatypeValidator.cpp       |  34 ++-
 .../datatype/IDREFDatatypeValidator.hpp       |  45 ++--
 .../datatype/ListDatatypeValidator.cpp        |  27 ++-
 .../datatype/ListDatatypeValidator.hpp        |  34 ++-
 .../datatype/MonthDatatypeValidator.cpp       |  29 ++-
 .../datatype/MonthDatatypeValidator.hpp       |  35 ++-
 .../datatype/MonthDayDatatypeValidator.cpp    |  29 ++-
 .../datatype/MonthDayDatatypeValidator.hpp    |  35 ++-
 .../datatype/NCNameDatatypeValidator.cpp      |  32 ++-
 .../datatype/NCNameDatatypeValidator.hpp      |  45 ++--
 .../datatype/NOTATIONDatatypeValidator.cpp    |  25 +-
 .../datatype/NOTATIONDatatypeValidator.hpp    |  33 ++-
 .../datatype/NameDatatypeValidator.cpp        |  32 ++-
 .../datatype/NameDatatypeValidator.hpp        |  46 ++--
 .../datatype/QNameDatatypeValidator.cpp       |  27 ++-
 .../datatype/QNameDatatypeValidator.hpp       |  35 ++-
 .../datatype/StringDatatypeValidator.cpp      |  32 ++-
 .../datatype/StringDatatypeValidator.hpp      |  46 ++--
 .../datatype/TimeDatatypeValidator.cpp        |  29 ++-
 .../datatype/TimeDatatypeValidator.hpp        |  34 ++-
 .../datatype/UnionDatatypeValidator.cpp       |  21 +-
 .../datatype/UnionDatatypeValidator.hpp       |  54 +++--
 .../datatype/YearDatatypeValidator.cpp        |  29 ++-
 .../datatype/YearDatatypeValidator.hpp        |  35 ++-
 .../datatype/YearMonthDatatypeValidator.cpp   |  29 ++-
 .../datatype/YearMonthDatatypeValidator.hpp   |  35 ++-
 .../validators/schema/ComplexTypeInfo.cpp     |  97 ++++----
 .../validators/schema/ComplexTypeInfo.hpp     |  31 ++-
 .../schema/GeneralAttributeCheck.cpp          |  11 +-
 .../schema/GeneralAttributeCheck.hpp          |  11 +-
 .../validators/schema/NamespaceScope.cpp      |  29 ++-
 .../validators/schema/NamespaceScope.hpp      |   8 +-
 .../validators/schema/SchemaElementDecl.cpp   |  25 +-
 .../validators/schema/SchemaElementDecl.hpp   |  28 ++-
 .../validators/schema/SchemaGrammar.cpp       |  37 ++-
 .../validators/schema/SchemaGrammar.hpp       |  16 +-
 src/xercesc/validators/schema/SchemaInfo.hpp  |   2 +-
 .../validators/schema/SchemaValidator.cpp     |   7 +-
 .../validators/schema/SchemaValidator.hpp     |  42 ++--
 .../validators/schema/TraverseSchema.cpp      | 201 ++++++++--------
 .../validators/schema/TraverseSchema.hpp      |   6 +-
 .../validators/schema/XSDDOMParser.cpp        |   5 +-
 .../validators/schema/XSDDOMParser.hpp        |   6 +-
 .../validators/schema/XSDErrorReporter.hpp    |   4 +-
 .../validators/schema/XercesAttGroupInfo.cpp  |   6 +-
 .../validators/schema/XercesAttGroupInfo.hpp  |  15 +-
 .../validators/schema/XercesGroupInfo.cpp     |   7 +-
 .../validators/schema/XercesGroupInfo.hpp     |   4 +-
 .../schema/identity/FieldActivator.cpp        |  10 +-
 .../schema/identity/FieldActivator.hpp        |  10 +-
 .../schema/identity/FieldValueMap.cpp         |  13 +-
 .../schema/identity/FieldValueMap.hpp         |  13 +-
 .../validators/schema/identity/IC_Field.cpp   |  16 +-
 .../validators/schema/identity/IC_Field.hpp   |  13 +-
 .../validators/schema/identity/IC_Key.cpp     |   8 +-
 .../validators/schema/identity/IC_Key.hpp     |   3 +-
 .../validators/schema/identity/IC_KeyRef.cpp  |   8 +-
 .../validators/schema/identity/IC_KeyRef.hpp  |   3 +-
 .../schema/identity/IC_Selector.cpp           |  14 +-
 .../schema/identity/IC_Selector.hpp           |  15 +-
 .../validators/schema/identity/IC_Unique.cpp  |   8 +-
 .../validators/schema/identity/IC_Unique.hpp  |   3 +-
 .../schema/identity/IdentityConstraint.cpp    |  16 +-
 .../schema/identity/IdentityConstraint.hpp    |  10 +-
 .../validators/schema/identity/ValueStore.cpp |  16 +-
 .../validators/schema/identity/ValueStore.hpp |   9 +-
 .../schema/identity/ValueStoreCache.cpp       |  21 +-
 .../schema/identity/ValueStoreCache.hpp       |   7 +-
 .../schema/identity/XPathMatcher.cpp          |  30 ++-
 .../schema/identity/XPathMatcher.hpp          |  18 +-
 .../schema/identity/XPathMatcherStack.cpp     |   9 +-
 .../schema/identity/XPathMatcherStack.hpp     |   6 +-
 .../schema/identity/XercesXPath.cpp           |  54 +++--
 .../schema/identity/XercesXPath.hpp           |  14 +-
 183 files changed, 3652 insertions(+), 1742 deletions(-)

diff --git a/src/xercesc/util/Transcoders/Cygwin/CygwinTransService.cpp b/src/xercesc/util/Transcoders/Cygwin/CygwinTransService.cpp
index f56d9bd60..bc40178da 100644
--- a/src/xercesc/util/Transcoders/Cygwin/CygwinTransService.cpp
+++ b/src/xercesc/util/Transcoders/Cygwin/CygwinTransService.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.5  2003/05/15 18:47:02  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.4  2003/03/09 17:02:20  peiyongz
  * PanicHandler
  *
@@ -672,9 +675,10 @@ bool CygwinTransService::isAlias(const   HKEY            encodingKey
 
 
 XMLTranscoder*
-CygwinTransService::makeNewXMLTranscoder(const   XMLCh* const            encodingName
+CygwinTransService::makeNewXMLTranscoder(const   XMLCh* const           encodingName
                                         ,       XMLTransService::Codes& resValue
-                                        , const unsigned int            blockSize)
+                                        , const unsigned int            blockSize
+                                        ,       MemoryManager* const    manager)
 {
     const unsigned int upLen = 1024;
     XMLCh upEncoding[upLen + 1];
@@ -703,7 +707,7 @@ CygwinTransService::makeNewXMLTranscoder(const   XMLCh* const            encodin
     }
 
     // We found it, so return a Cygwin transcoder for this encoding
-    return new CygwinTranscoder
+    return new (manager) CygwinTranscoder
     (
         encodingName
         , theEntry->getWinCP()
@@ -1024,6 +1028,36 @@ char* CygwinLCPTranscoder::transcode(const XMLCh* const toTranscode)
     return retVal;
 }
 
+char* CygwinLCPTranscoder::transcode(const XMLCh* const toTranscode
+                                     MemoryManager* const manager)
+{
+    if (!toTranscode)
+        return 0;
+
+    char* retVal = 0;
+    if (*toTranscode)
+    {
+        // Calc the needed size
+        const unsigned int neededLen = ::WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)toTranscode, -1, NULL, 0, NULL, NULL);
+        if (neededLen == (unsigned int)-1)
+            return 0;
+
+        // Allocate a buffer of that size plus one for the null and transcode
+        // Returned length of WideCharToMultiByte includes terminating NUL.
+        retVal = (char*) manager->allocate((neededLen+1) * sizeof(char)); //new char[neededLen+1];
+        ::WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)toTranscode, -1, retVal, neededLen+1, NULL, NULL);
+
+        // And cap it off anyway just to make sure
+        retVal[neededLen] = 0;
+    }
+    else
+    {
+        retVal = (char*) manager->allocate(sizeof(char)); //new char[1];
+        retVal[0] = 0;
+    }
+    return retVal;
+}
+
 
 XMLCh* CygwinLCPTranscoder::transcode(const char* const toTranscode)
 {
@@ -1053,6 +1087,35 @@ XMLCh* CygwinLCPTranscoder::transcode(const char* const toTranscode)
     return retVal;
 }
 
+XMLCh* CygwinLCPTranscoder::transcode(const char* const toTranscode,
+                                      MemoryManager* const manager)
+{
+    if (!toTranscode)
+        return 0;
+
+    XMLCh* retVal = 0;
+    if (*toTranscode)
+    {
+        // Calculate the buffer size required
+        const unsigned int neededLen = ::MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, toTranscode, -1, NULL, 0);
+        if (neededLen == (unsigned int)-1)
+            return 0;
+
+        // Allocate a buffer of that size plus one for the null and transcode
+        retVal = (XMLCh*) manager->allocate((neededLen + 1) * sizeof(XMLCh)); //new XMLCh[neededLen + 1];
+        ::MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, toTranscode, -1, (LPWSTR)retVal, neededLen + 1);
+
+        // Cap it off just to make sure. We are so paranoid!
+        retVal[neededLen] = 0;
+    }
+    else
+    {
+        retVal = (XMLCh*) manager->allocate(sizeof(XMLCh)); //new XMLCh[1];
+        retVal[0] = 0;
+    }
+    return retVal;
+}
+
 
 bool CygwinLCPTranscoder::transcode( const   char* const    toTranscode
                                     ,       XMLCh* const    toFill
diff --git a/src/xercesc/util/Transcoders/Cygwin/CygwinTransService.hpp b/src/xercesc/util/Transcoders/Cygwin/CygwinTransService.hpp
index 5fd6d5673..36535b23d 100644
--- a/src/xercesc/util/Transcoders/Cygwin/CygwinTransService.hpp
+++ b/src/xercesc/util/Transcoders/Cygwin/CygwinTransService.hpp
@@ -120,6 +120,7 @@ protected :
         const   XMLCh* const            encodingName
         ,       XMLTransService::Codes& resValue
         , const unsigned int            blockSize
+        ,       MemoryManager* const    manager
     );
 
     virtual int auxCompareString
@@ -259,8 +260,12 @@ public :
     virtual unsigned int calcRequiredSize(const XMLCh* const srcText);
 
     virtual char* transcode(const XMLCh* const toTranscode);
+    virtual char* transcode(const XMLCh* const toTranscode,
+                            MemoryManager* const manager);
 
     virtual XMLCh* transcode(const char* const toTranscode);
+    virtual XMLCh* transcode(const char* const toTranscode,
+                             MemoryManager* const manager);
 
     virtual bool transcode
     (
diff --git a/src/xercesc/util/Transcoders/ICU/ICUTransService.cpp b/src/xercesc/util/Transcoders/ICU/ICUTransService.cpp
index c7b380e8f..28d582a2c 100644
--- a/src/xercesc/util/Transcoders/ICU/ICUTransService.cpp
+++ b/src/xercesc/util/Transcoders/ICU/ICUTransService.cpp
@@ -332,7 +332,8 @@ void ICUTransService::lowerCase(XMLCh* const toLowerCase) const
 XMLTranscoder* ICUTransService::
 makeNewXMLTranscoder(const  XMLCh* const            encodingName
                     ,       XMLTransService::Codes& resValue
-                    , const unsigned int            blockSize)
+                    , const unsigned int            blockSize
+                    ,       MemoryManager* const    manager)
 {
     //
     //  If UChar and XMLCh are not the same size, then we have premassage the
@@ -360,7 +361,7 @@ makeNewXMLTranscoder(const  XMLCh* const            encodingName
         return 0;
     }
 
-    return new ICUTranscoder(encodingName, converter, blockSize);
+    return new (manager) ICUTranscoder(encodingName, converter, blockSize);
 }
 
 
diff --git a/src/xercesc/util/Transcoders/ICU/ICUTransService.hpp b/src/xercesc/util/Transcoders/ICU/ICUTransService.hpp
index caad7771e..a56ad59fe 100644
--- a/src/xercesc/util/Transcoders/ICU/ICUTransService.hpp
+++ b/src/xercesc/util/Transcoders/ICU/ICUTransService.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.7  2003/05/15 18:47:03  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.6  2003/03/07 18:15:57  tng
  * Return a reference instead of void for operator=
  *
@@ -172,6 +175,7 @@ protected :
         const   XMLCh* const            encodingName
         ,       XMLTransService::Codes& resValue
         , const unsigned int            blockSize
+        ,       MemoryManager* const    manager
     );
 
 
@@ -280,8 +284,12 @@ public :
     virtual unsigned int calcRequiredSize(const XMLCh* const srcText);
 
     virtual char* transcode(const XMLCh* const toTranscode);
+    virtual char* transcode(const XMLCh* const toTranscode,
+                            MemoryManager* const manager);
 
     virtual XMLCh* transcode(const char* const toTranscode);
+    virtual XMLCh* transcode(const char* const toTranscode,
+                             MemoryManager* const manager);
 
     virtual bool transcode
     (
diff --git a/src/xercesc/util/Transcoders/Iconv/IconvTransService.cpp b/src/xercesc/util/Transcoders/Iconv/IconvTransService.cpp
index d70f03f13..07828f185 100644
--- a/src/xercesc/util/Transcoders/Iconv/IconvTransService.cpp
+++ b/src/xercesc/util/Transcoders/Iconv/IconvTransService.cpp
@@ -62,10 +62,12 @@
 // ---------------------------------------------------------------------------
 //  Includes
 // ---------------------------------------------------------------------------
+#include "IconvTransService.hpp"
 #include <xercesc/util/XMLUniDefs.hpp>
 #include <xercesc/util/XMLUni.hpp>
-#include "IconvTransService.hpp"
+#include <xercesc/framework/MemoryManager.hpp>
 #include <wchar.h>
+
 #if defined (XML_GCC) || defined (XML_PTX) || defined (XML_IBMVAOS2)
     #if defined(XML_BEOS)
         wint_t towlower(wint_t wc) {
@@ -214,7 +216,8 @@ bool IconvTransService::supportsSrcOfs() const
 XMLTranscoder*
 IconvTransService::makeNewXMLTranscoder(const   XMLCh* const            encodingName
                                         ,       XMLTransService::Codes& resValue
-                                        , const unsigned int            )
+                                        , const unsigned int            
+                                        ,       MemoryManager* const)
 {
     //
     //  NOTE: We don't use the block size here
@@ -347,6 +350,58 @@ char* IconvLCPTranscoder::transcode(const XMLCh* const toTranscode)
     return retVal;
 }
 
+char* IconvLCPTranscoder::transcode(const XMLCh* const toTranscode,
+                                    MemoryManager* const manager)
+{
+    if (!toTranscode)
+        return 0;
+
+    char* retVal = 0;
+    if (*toTranscode)
+    {
+        unsigned int  wLent = getWideCharLength(toTranscode);
+
+        wchar_t       tmpWideCharArr[gTempBuffArraySize];
+        wchar_t*      allocatedArray = 0;
+        wchar_t*      wideCharBuf = 0;
+
+        if (wLent >= gTempBuffArraySize)
+            wideCharBuf = allocatedArray = (wchar_t*) manager->allocate
+            (
+                (wLent + 1) * sizeof(wchar_t)
+            );//new wchar_t[wLent + 1];
+        else
+            wideCharBuf = tmpWideCharArr;
+
+        for (unsigned int i = 0; i < wLent; i++)
+        {
+            wideCharBuf[i] = toTranscode[i];
+        }
+        wideCharBuf[wLent] = 0x00;
+
+        // Calc the needed size.
+        const size_t neededLen = ::wcstombs(NULL, wideCharBuf, 0);
+        if (neededLen == -1)
+        {
+            manager->deallocate(allocatedArray);//delete [] allocatedArray;
+            retVal = (char*) manager->allocate(sizeof(char)); //new char[1];
+            retVal[0] = 0;
+            return retVal;
+        }
+
+        retVal = (char*) manager->allocate((neededLen + 1) * sizeof(char));//new char[neededLen + 1];
+        ::wcstombs(retVal, wideCharBuf, neededLen);
+        retVal[neededLen] = 0;
+        manager->deallocate(allocatedArray);//delete [] allocatedArray;
+    }
+    else
+    {
+        retVal = (char*) manager->allocate(sizeof(char));//new char[1];
+        retVal[0] = 0;
+    }
+    return retVal;
+}
+
 
 bool IconvLCPTranscoder::transcode( const   XMLCh* const    toTranscode
                                     ,       char* const     toFill
@@ -443,6 +498,52 @@ XMLCh* IconvLCPTranscoder::transcode(const char* const toTranscode)
     return retVal;
 }
 
+XMLCh* IconvLCPTranscoder::transcode(const char* const toTranscode,
+                                     MemoryManager* const manager)
+{
+    if (!toTranscode)
+        return 0;
+
+    XMLCh* retVal = 0;
+    if (*toTranscode)
+    {
+        const unsigned int len = calcRequiredSize(toTranscode);
+        if (len == 0)
+        {
+            retVal = (XMLCh*) manager->allocate(sizeof(XMLCh)); //new XMLCh[1];
+            retVal[0] = 0;
+            return retVal;
+        }
+
+        wchar_t       tmpWideCharArr[gTempBuffArraySize];
+        wchar_t*      allocatedArray = 0;
+        wchar_t*      wideCharBuf = 0;
+
+        if (len >= gTempBuffArraySize)
+            wideCharBuf = allocatedArray = (wchar_t*) manager->allocate
+            (
+                (len + 1) * sizeof(wchar_t)
+            );//new wchar_t[len + 1];
+        else
+            wideCharBuf = tmpWideCharArr;
+
+        ::mbstowcs(wideCharBuf, toTranscode, len);
+        retVal = (XMLCh*) manager->allocate((len + 1) *sizeof(XMLCh));//new XMLCh[len + 1];
+        for (unsigned int i = 0; i < len; i++)
+        {
+            retVal[i] = (XMLCh) wideCharBuf[i];
+        }
+        retVal[len] = 0x00;
+        manager->deallocate(allocatedArray);//delete [] allocatedArray;
+    }
+    else
+    {
+        retVal = (XMLCh*) manager->allocate(sizeof(XMLCh));//new XMLCh[1];
+        retVal[0] = 0;
+    }
+    return retVal;
+}
+
 
 bool IconvLCPTranscoder::transcode( const   char* const     toTranscode
                                     ,       XMLCh* const    toFill
diff --git a/src/xercesc/util/Transcoders/Iconv/IconvTransService.hpp b/src/xercesc/util/Transcoders/Iconv/IconvTransService.hpp
index 1b7f71809..728a4c3d0 100644
--- a/src/xercesc/util/Transcoders/Iconv/IconvTransService.hpp
+++ b/src/xercesc/util/Transcoders/Iconv/IconvTransService.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.6  2003/05/15 18:47:03  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.5  2003/03/07 18:15:57  tng
  * Return a reference instead of void for operator=
  *
@@ -157,6 +160,7 @@ protected :
         const   XMLCh* const            encodingName
         ,       XMLTransService::Codes& resValue
         , const unsigned int            blockSize
+        ,       MemoryManager* const    manager
     );
 
 
@@ -187,6 +191,8 @@ public :
     virtual unsigned int calcRequiredSize(const XMLCh* const srcText);
 
     virtual char* transcode(const XMLCh* const toTranscode);
+    virtual char* transcode(const XMLCh* const toTranscode,
+                            MemoryManager* const manager);
 
     virtual bool transcode
     (
@@ -196,6 +202,8 @@ public :
     );
 
     virtual XMLCh* transcode(const char* const toTranscode);
+    virtual XMLCh* transcode(const char* const toTranscode,
+                             MemoryManager* const manager);
 
     virtual bool transcode
     (
diff --git a/src/xercesc/util/Transcoders/Iconv390/Iconv390TransService.cpp b/src/xercesc/util/Transcoders/Iconv390/Iconv390TransService.cpp
index c45467831..5ee01923a 100644
--- a/src/xercesc/util/Transcoders/Iconv390/Iconv390TransService.cpp
+++ b/src/xercesc/util/Transcoders/Iconv390/Iconv390TransService.cpp
@@ -62,10 +62,11 @@
 // ---------------------------------------------------------------------------
 //  Includes
 // ---------------------------------------------------------------------------
+#include "Iconv390TransService.hpp"
 #include <xercesc/util/XMLUniDefs.hpp>
 #include <xercesc/util/XMLUni.hpp>
 #include <xercesc/util/regx/XMLUniCharacter.hpp>
-#include "Iconv390TransService.hpp"
+#include <xercesc/framework/MemoryManager.hpp>
 
 #include <wchar.h>
 #include <string.h>
@@ -316,7 +317,8 @@ bool Iconv390TransService::supportsSrcOfs() const
 XMLTranscoder*
 Iconv390TransService::makeNewXMLTranscoder(const   XMLCh* const            encodingName
                                         ,       XMLTransService::Codes& resValue
-                                        , const unsigned int            )
+                                        , const unsigned int
+                                        ,       MemoryManager* const)
 {
     //  This is a minimalist transcoding service, that only supports a local
     //  default transcoder. All named encodings return zero as a failure,
@@ -425,6 +427,36 @@ char* Iconv390LCPTranscoder::transcode(const XMLCh* const toTranscode)
     return retVal;
 }
 
+char* Iconv390LCPTranscoder::transcode(const XMLCh* const toTranscode,
+                                       MemoryManager* const manager)
+{
+    if (!toTranscode)
+        return 0;
+
+    char* retVal = 0;
+    if (*toTranscode)
+    {
+        unsigned int  wLent = getWideCharLength(toTranscode);
+	//
+	//  Translate the input from Unicode XMLCh format into
+	//  ibm-037 char format via the lookup table.
+	//
+        retVal = (char*) manager->allocate((wLent + 1) * sizeof(char));//new char[wLent + 1];
+        const XMLCh *srcPtr = toTranscode;
+        char *outPtr = retVal;
+
+	while (*srcPtr != 0)
+	    *outPtr++ = gUnicodeToIBM037XlatTable[*srcPtr++];
+	*outPtr=0;
+    }
+    else
+    {
+        retVal = (char*) manager->allocate(sizeof(char));//new char[1];
+        retVal[0] = 0;
+    }
+    return retVal;
+}
+
 
 bool Iconv390LCPTranscoder::transcode( const   XMLCh* const    toTranscode
                                     ,       char* const     toFill
@@ -503,6 +535,53 @@ XMLCh* Iconv390LCPTranscoder::transcode(const char* const toTranscode)
     return retVal;
 }
 
+XMLCh* Iconv390LCPTranscoder::transcode(const char* const toTranscode,
+                                        MemoryManager* const manager)
+{
+    if (!toTranscode)
+        return 0;
+
+    XMLCh* retVal = 0;
+    if (*toTranscode)
+    {
+        const unsigned int len = calcRequiredSize(toTranscode);
+        if (len == 0)
+        {
+            retVal = (XMLCh*) manager->allocate(sizeof(XMLCh));//new XMLCh[1];
+            retVal[0] = 0;
+            return retVal;
+        }
+
+        wchar_t       tmpWideCharArr[gTempBuffArraySize];
+        wchar_t*      allocatedArray = 0;
+        wchar_t*      wideCharBuf = 0;
+
+        retVal = (XMLCh*) manager->allocate((len + 1) * sizeof(XMLCh));//new XMLCh[len + 1];
+
+        size_t retCode;
+        char *tmpInPtr = (char*) toTranscode;
+        char *tmpOutPtr = (char*) retVal;
+        size_t inByteLeft = len;
+        size_t outByteLeft = len*2;
+        {
+         XMLMutexLock lockConverter(&converter->fMutex);
+         retCode = iconv(converter->fIconv390Descriptor, &tmpInPtr, &inByteLeft, &tmpOutPtr, &outByteLeft);
+        }
+        if (retCode == -1) {
+            delete [] retVal;
+            return 0;
+        }
+        retVal[len] = 0x00;
+        delete [] allocatedArray;
+    }
+    else
+    {
+        retVal = (XMLCh*) manager->allocate(sizeof(XMLCh));//new XMLCh[1];
+        retVal[0] = 0;
+    }
+    return retVal;
+}
+
 
 bool Iconv390LCPTranscoder::transcode( const   char* const     toTranscode
                                     ,       XMLCh* const    toFill
diff --git a/src/xercesc/util/Transcoders/Iconv390/Iconv390TransService.hpp b/src/xercesc/util/Transcoders/Iconv390/Iconv390TransService.hpp
index 7dedfa42a..c0221e34f 100644
--- a/src/xercesc/util/Transcoders/Iconv390/Iconv390TransService.hpp
+++ b/src/xercesc/util/Transcoders/Iconv390/Iconv390TransService.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.6  2003/05/15 18:47:03  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.5  2003/03/07 18:15:57  tng
  * Return a reference instead of void for operator=
  *
@@ -150,6 +153,7 @@ protected :
         const   XMLCh* const            encodingName
         ,       XMLTransService::Codes& resValue
         , const unsigned int            blockSize
+        ,       MemoryManager* const    manager
     );
 
 
@@ -179,6 +183,8 @@ public :
     virtual unsigned int calcRequiredSize(const XMLCh* const srcText);
 
     virtual char* transcode(const XMLCh* const toTranscode);
+    virtual char* transcode(const XMLCh* const toTranscode,
+                            MemoryManager* const manager);
 
     virtual bool transcode
     (
@@ -188,6 +194,8 @@ public :
     );
 
     virtual XMLCh* transcode(const char* const toTranscode);
+    virtual XMLCh* transcode(const char* const toTranscode,
+                             MemoryManager* const manager);
 
     virtual bool transcode
     (
diff --git a/src/xercesc/util/Transcoders/Iconv400/Iconv400TransService.cpp b/src/xercesc/util/Transcoders/Iconv400/Iconv400TransService.cpp
index 187ccc6d1..c5c2f85bb 100644
--- a/src/xercesc/util/Transcoders/Iconv400/Iconv400TransService.cpp
+++ b/src/xercesc/util/Transcoders/Iconv400/Iconv400TransService.cpp
@@ -316,7 +316,8 @@ XMLCh Iconv400TransService::toUnicodeLower(XMLCh comp1) const
 XMLTranscoder*
 Iconv400TransService::makeNewXMLTranscoder(  const   XMLCh* const            encodingName
                                         ,       XMLTransService::Codes& resValue
-                                        , const unsigned int            blockSize)
+                                        , const unsigned int            blockSize
+                                        ,       MemoryManager* const    manager)
 {
     UErrorCode uerr = U_ZERO_ERROR;
     UConverter* converter = ucnv_openU(encodingName, &uerr);
@@ -325,7 +326,7 @@ Iconv400TransService::makeNewXMLTranscoder(  const   XMLCh* const            enc
         resValue = XMLTransService::UnsupportedEncoding;
         return 0;
     }
-    return new Iconv400Transcoder(encodingName, converter, blockSize);
+    return new (manager) Iconv400Transcoder(encodingName, converter, blockSize);
 }
 
 
@@ -769,6 +770,76 @@ char* Iconv400LCPTranscoder::transcode(const XMLCh* const toTranscode)
     return retBuf;
 }
 
+char* Iconv400LCPTranscoder::transcode(const XMLCh* const toTranscode,
+                                       MemoryManager* const manager)
+{
+    char* retBuf = 0;
+
+    // Check for a couple of special cases
+    if (!toTranscode)
+        return 0;
+
+    if (!*toTranscode)
+    {
+        retBuf = (char*) manager->allocate(sizeof(char));//new char[1];
+        retBuf[0] = 0;
+        return retBuf;
+    }
+
+    // Caculate a return buffer size not too big, but less likely to overflow
+    int32_t targetLen = (int32_t)(u_strlen(toTranscode) * 1.25);
+
+    // Allocate the return buffer
+    retBuf = (char*) manager->allocate((targetLen + 1) * sizeof(char));//new char[targetLen + 1];
+
+    // Lock now while we call the converter.
+    UErrorCode err = U_ZERO_ERROR;
+    int32_t targetCap;
+    {
+        XMLMutexLock lockConverter(&fMutex);
+
+        //Convert the Unicode string to char*
+        targetCap = ucnv_fromUChars
+        (
+            fConverter
+            , retBuf
+            , targetLen + 1
+            , toTranscode
+            , &err
+        );
+    }
+
+    // If targetLen is not enough then buffer overflow might occur
+    if (err == U_BUFFER_OVERFLOW_ERROR)
+    {
+        // Reset the error, delete the old buffer, allocate a new one, and try again
+        err = U_ZERO_ERROR;
+        manager->deallocate(retBuf);//delete [] retBuf;
+        retBuf = (char*) manager->allocate(targetCap * sizeof(char));//new char[targetCap];
+
+        // Lock again before we retry
+        XMLMutexLock lockConverter(&fMutex);
+        targetCap = ucnv_fromUChars
+        (
+            fConverter
+            , retBuf
+            , targetCap
+            , toTranscode
+            , &err
+        );
+    }
+
+    if (U_FAILURE(err))
+    {
+        manager->deallocate(retBuf);//delete [] retBuf;
+        return 0;
+    }
+
+    // Cap it off and return
+    retBuf[targetCap] = 0;
+    return retBuf;
+}
+
 XMLCh* Iconv400LCPTranscoder::transcode(const char* const toTranscode)
 {
     // Watch for a few pyscho corner cases
@@ -840,6 +911,78 @@ XMLCh* Iconv400LCPTranscoder::transcode(const char* const toTranscode)
     return retVal;
 }
 
+XMLCh* Iconv400LCPTranscoder::transcode(const char* const toTranscode,
+                                        MemoryManager* const manager)
+{
+    // Watch for a few pyscho corner cases
+    if (!toTranscode)
+        return 0;
+
+    XMLCh* retVal = 0;
+    if (!*toTranscode)
+    {
+        retVal = (XMLCh*) manager->allocate(sizeof(XMLCh));//new XMLCh[1];
+        retVal[0] = 0;
+        return retVal;
+    }
+
+    //
+    //  Get the length of the string to transcode. The Unicode string will
+    //  almost always be no more chars than were in the source, so this is
+    //  the best guess as to the storage needed.
+    //
+    const int32_t srcLen = (int32_t)strlen(toTranscode);
+    // Allocate unicode string of equivalent length in unicode bytes
+    retVal = (XMLCh*) manager->allocate((srcLen + 1) * sizeof(XMLCh));//new XMLCh[srcLen+1];
+
+    // Now lock while we do these calculations
+    UErrorCode err = U_ZERO_ERROR;
+    {
+        XMLMutexLock lockConverter(&fMutex);
+
+        //
+        //  Here we don't know what the target length will be so use 0 and
+        //  expect an U_BUFFER_OVERFLOW_ERROR in which case it'd get resolved
+        //  by the correct capacity value.
+        //
+        int32_t targetCap;
+        targetCap = ucnv_toUChars
+        (
+            fConverter
+            , retVal
+            , srcLen+1
+            , toTranscode
+            , srcLen
+            , &err
+        );
+
+        if (err != U_BUFFER_OVERFLOW_ERROR)
+	{
+
+        err = U_ZERO_ERROR;
+        retVal = (XMLCh*) manager->allocate(targetCap * sizeof(XMLCh));//new XMLCh[targetCap];
+        ucnv_toUChars
+        (
+            fConverter
+            , retVal
+            , targetCap
+            , toTranscode
+            , srcLen
+            , &err
+           );
+	 }
+   }
+
+    if (U_FAILURE(err))
+    {
+        // Clean up if we got anything allocated
+        manager->deallocate(retVal);//delete [] retVal;
+        return 0;
+    }
+
+    return retVal;
+}
+
 
 bool Iconv400LCPTranscoder::transcode(const  char* const     toTranscode
                                 ,       XMLCh* const    toFill
diff --git a/src/xercesc/util/Transcoders/Iconv400/Iconv400TransService.hpp b/src/xercesc/util/Transcoders/Iconv400/Iconv400TransService.hpp
index a65c85ca8..3814c89f7 100644
--- a/src/xercesc/util/Transcoders/Iconv400/Iconv400TransService.hpp
+++ b/src/xercesc/util/Transcoders/Iconv400/Iconv400TransService.hpp
@@ -122,6 +122,7 @@ protected :
         const   XMLCh* const            encodingName
         ,       XMLTransService::Codes& resValue
         , const unsigned int            blockSize
+        ,       MemoryManager* const    manager
     );
 
 
@@ -237,8 +238,12 @@ public :
     virtual unsigned int calcRequiredSize(const XMLCh* const srcText);
 
     virtual char* transcode(const XMLCh* const toTranscode);
+    virtual char* transcode(const XMLCh* const toTranscode,
+                            MemoryManager* const manager);
 
     virtual XMLCh* transcode(const char* const toTranscode);
+    virtual XMLCh* transcode(const char* const toTranscode,
+                             MemoryManager* const manager);
 
     virtual bool transcode
     (
diff --git a/src/xercesc/util/Transcoders/IconvFBSD/IconvFBSDTransService.cpp b/src/xercesc/util/Transcoders/IconvFBSD/IconvFBSDTransService.cpp
index c0e2a5771..17f084fc0 100644
--- a/src/xercesc/util/Transcoders/IconvFBSD/IconvFBSDTransService.cpp
+++ b/src/xercesc/util/Transcoders/IconvFBSD/IconvFBSDTransService.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.12  2003/05/15 18:47:04  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.11  2003/03/09 17:02:57  peiyongz
  * PanicHandler
  *
@@ -842,6 +845,7 @@ IconvFBSDTransService::makeNewXMLTranscoder
     const    XMLCh* const    encodingName
     ,    XMLTransService::Codes&    resValue
     , const     unsigned int    blockSize
+    ,       MemoryManager* const    manager
 )
 {
 #ifndef XML_USE_LIBICONV
@@ -860,7 +864,7 @@ IconvFBSDTransService::makeNewXMLTranscoder
     resValue = XMLTransService::UnsupportedEncoding;
     IconvFBSDTranscoder    *newTranscoder = NULL;
 
-    char    *encLocal = XMLString::transcode(encodingName);
+    char    *encLocal = XMLString::transcode(encodingName, manager);
     iconv_t    cd_from, cd_to;
 
     {
@@ -869,7 +873,7 @@ IconvFBSDTransService::makeNewXMLTranscoder
         if (cd_from == (iconv_t)-1) {
             resValue = XMLTransService::SupportFilesNotFound;
             if (encLocal)
-            delete [] encLocal;
+            manager->deallocate(encLocal);//delete [] encLocal;
             return NULL;
         }
         cd_to = iconv_open (encLocal, fUnicodeCP);
@@ -877,10 +881,10 @@ IconvFBSDTransService::makeNewXMLTranscoder
             resValue = XMLTransService::SupportFilesNotFound;
             iconv_close (cd_from);
             if (encLocal)
-            delete [] encLocal;
+            manager->deallocate(encLocal);//delete [] encLocal;
             return NULL;
         }
-        newTranscoder = new IconvFBSDTranscoder (encodingName,
+        newTranscoder = new (manager) IconvFBSDTranscoder (encodingName,
                              blockSize,
                              cd_from, cd_to,
                              uChSize(), UBO());
@@ -888,7 +892,7 @@ IconvFBSDTransService::makeNewXMLTranscoder
     if (newTranscoder)
         resValue = XMLTransService::Ok;
     if (encLocal)
-        delete [] encLocal;
+        manager->deallocate(encLocal);//delete [] encLocal;
     return newTranscoder;
 
 #endif /* !XML_USE_LIBICONV */
diff --git a/src/xercesc/util/Transcoders/IconvFBSD/IconvFBSDTransService.hpp b/src/xercesc/util/Transcoders/IconvFBSD/IconvFBSDTransService.hpp
index 0dc918d06..27183fbbf 100644
--- a/src/xercesc/util/Transcoders/IconvFBSD/IconvFBSDTransService.hpp
+++ b/src/xercesc/util/Transcoders/IconvFBSD/IconvFBSDTransService.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.7  2003/05/15 18:47:04  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.6  2003/03/07 18:15:57  tng
  * Return a reference instead of void for operator=
  *
@@ -270,6 +273,7 @@ protected :
         const   XMLCh* const            encodingName
         ,       XMLTransService::Codes& resValue
         , const unsigned int            blockSize
+        ,       MemoryManager* const    manager
     );
 
 
@@ -401,6 +405,8 @@ public:
     virtual unsigned int calcRequiredSize(const XMLCh* const srcText);
 
     virtual char* transcode(const XMLCh* const toTranscode);
+    virtual char* transcode(const XMLCh* const toTranscode,
+                            MemoryManager* const manager);
 
     virtual bool transcode
     (
@@ -410,6 +416,8 @@ public:
     );
 
     virtual XMLCh* transcode(const char* const toTranscode);
+    virtual XMLCh* transcode(const char* const toTranscode,
+                             MemoryManager* const manager);
 
     virtual bool transcode
     (
diff --git a/src/xercesc/util/Transcoders/IconvGNU/IconvGNUTransService.cpp b/src/xercesc/util/Transcoders/IconvGNU/IconvGNUTransService.cpp
index 4d3693777..78e541ae5 100644
--- a/src/xercesc/util/Transcoders/IconvGNU/IconvGNUTransService.cpp
+++ b/src/xercesc/util/Transcoders/IconvGNU/IconvGNUTransService.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.7  2003/05/15 18:47:05  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.6  2003/04/07 16:52:13  peiyongz
  * Bug# 18672: IconvGNUTranscoder can't be build when namespaces is on.
  *                       Patch from Bacek@yandex-team.ru (Vasily Tchekalkin)
@@ -658,12 +661,13 @@ IconvGNUTransService::makeNewXMLTranscoder
     const    XMLCh* const    encodingName
     ,    XMLTransService::Codes&    resValue
     , const    unsigned int    blockSize
+    ,        MemoryManager* const    manager
 )
 {
     resValue = XMLTransService::UnsupportedEncoding;
     IconvGNUTranscoder    *newTranscoder = NULL;
 
-    char    *encLocal = XMLString::transcode(encodingName);
+    char    *encLocal = XMLString::transcode(encodingName, manager);
     iconv_t    cd_from, cd_to;
 
     {
@@ -672,7 +676,7 @@ IconvGNUTransService::makeNewXMLTranscoder
         if (cd_from == (iconv_t)-1) {
             resValue = XMLTransService::SupportFilesNotFound;
             if (encLocal)
-                delete [] encLocal;
+                manager->deallocate(encLocal);//delete [] encLocal;
             return NULL;
         }
         cd_to = iconv_open (encLocal, fUnicodeCP);
@@ -680,10 +684,10 @@ IconvGNUTransService::makeNewXMLTranscoder
             resValue = XMLTransService::SupportFilesNotFound;
             iconv_close (cd_from);
             if (encLocal)
-                delete [] encLocal;
+                manager->deallocate(encLocal);//delete [] encLocal;
             return NULL;
         }
-        newTranscoder = new IconvGNUTranscoder (encodingName,
+        newTranscoder = new (manager) IconvGNUTranscoder (encodingName,
                              blockSize,
                              cd_from, cd_to,
                              uChSize(), UBO());
@@ -691,7 +695,7 @@ IconvGNUTransService::makeNewXMLTranscoder
     if (newTranscoder)
         resValue = XMLTransService::Ok;
     if (encLocal)
-        delete [] encLocal;
+        manager->deallocate(encLocal);//delete [] encLocal;
     return newTranscoder;
 }
 
diff --git a/src/xercesc/util/Transcoders/IconvGNU/IconvGNUTransService.hpp b/src/xercesc/util/Transcoders/IconvGNU/IconvGNUTransService.hpp
index 7a942ef24..4f6450680 100644
--- a/src/xercesc/util/Transcoders/IconvGNU/IconvGNUTransService.hpp
+++ b/src/xercesc/util/Transcoders/IconvGNU/IconvGNUTransService.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.4  2003/05/15 18:47:05  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2003/03/07 18:15:57  tng
  * Return a reference instead of void for operator=
  *
@@ -243,6 +246,7 @@ protected :
         const   XMLCh* const            encodingName
         ,       XMLTransService::Codes& resValue
         , const unsigned int            blockSize
+        ,       MemoryManager* const    manager
     );
 
 
@@ -359,6 +363,8 @@ public:
     virtual unsigned int calcRequiredSize(const XMLCh* const srcText);
 
     virtual char* transcode(const XMLCh* const toTranscode);
+    virtual char* transcode(const XMLCh* const toTranscode,
+                            MemoryManager* const manager);
 
     virtual bool transcode
     (
@@ -368,6 +374,8 @@ public:
     );
 
     virtual XMLCh* transcode(const char* const toTranscode);
+    virtual XMLCh* transcode(const char* const toTranscode,
+                             MemoryManager* const manager);
 
     virtual bool transcode
     (
diff --git a/src/xercesc/util/Transcoders/MacOSUnicodeConverter/MacOSUnicodeConverter.cpp b/src/xercesc/util/Transcoders/MacOSUnicodeConverter/MacOSUnicodeConverter.cpp
index 9a7e8f5b6..797a2ef00 100644
--- a/src/xercesc/util/Transcoders/MacOSUnicodeConverter/MacOSUnicodeConverter.cpp
+++ b/src/xercesc/util/Transcoders/MacOSUnicodeConverter/MacOSUnicodeConverter.cpp
@@ -533,7 +533,8 @@ MacOSUnicodeConverter::ConvertWideToNarrow(const XMLCh* wide, char* narrow, std:
 XMLTranscoder*
 MacOSUnicodeConverter::makeNewXMLTranscoder(const   XMLCh* const		encodingName
                                         ,       XMLTransService::Codes& resValue
-                                        , const unsigned int			blockSize)
+                                        , const unsigned int			blockSize
+                                        ,       MemoryManager* const    manager)
 {
 	XMLTranscoder* result = NULL;
 	resValue = XMLTransService::Ok;
@@ -578,7 +579,7 @@ MacOSUnicodeConverter::makeNewXMLTranscoder(const   XMLCh* const		encodingName
 		resValue = XMLTransService::UnsupportedEncoding;
 	}
 	else
-		result = new MacOSTranscoder(encodingName, textToUnicodeInfo, unicodeToTextInfo, blockSize);
+		result = new (manager) MacOSTranscoder(encodingName, textToUnicodeInfo, unicodeToTextInfo, blockSize);
 	
     return result;
 }
diff --git a/src/xercesc/util/Transcoders/MacOSUnicodeConverter/MacOSUnicodeConverter.hpp b/src/xercesc/util/Transcoders/MacOSUnicodeConverter/MacOSUnicodeConverter.hpp
index 3a4aab327..86c5c69e9 100644
--- a/src/xercesc/util/Transcoders/MacOSUnicodeConverter/MacOSUnicodeConverter.hpp
+++ b/src/xercesc/util/Transcoders/MacOSUnicodeConverter/MacOSUnicodeConverter.hpp
@@ -129,6 +129,7 @@ protected :
         const   XMLCh* const            encodingName
         ,       XMLTransService::Codes& resValue
         , const unsigned int            blockSize
+        ,       MemoryManager* const    manager
     );
 
     //	Sniff for available functionality
@@ -253,8 +254,12 @@ public :
     virtual unsigned int calcRequiredSize(const XMLCh* const srcText);
 
     virtual char* transcode(const XMLCh* const toTranscode);
+    virtual char* transcode(const XMLCh* const toTranscode,
+                            MemoryManager* const manager);
 
     virtual XMLCh* transcode(const char* const toTranscode);
+    virtual char* transcode(const XMLCh* const toTranscode,
+                            MemoryManager* const manager);
 
     virtual bool transcode
     (
diff --git a/src/xercesc/util/Transcoders/Uniconv390/Uniconv390TransService.cpp b/src/xercesc/util/Transcoders/Uniconv390/Uniconv390TransService.cpp
index a5587ac84..9e2a05449 100644
--- a/src/xercesc/util/Transcoders/Uniconv390/Uniconv390TransService.cpp
+++ b/src/xercesc/util/Transcoders/Uniconv390/Uniconv390TransService.cpp
@@ -472,16 +472,17 @@ DBGPRINTF2("makeNewLCPTranscoder() localencoding=%s \n",nl_langinfo(CODESET));
 XMLTranscoder* Uniconv390TransService::
 makeNewXMLTranscoder(const  XMLCh* const            encodingName
                     ,       XMLTransService::Codes& resValue
-                    , const unsigned int            blockSize)
+                    , const unsigned int            blockSize
+                    ,       MemoryManager* const    manager)
 {
-char * localname = XMLString::transcode(encodingName);
-ArrayJanitor<char> janText((char*)localname);
+char * localname = XMLString::transcode(encodingName, manager);
+ArrayJanitor<char> janText((char*)localname, manager);
 DBGPRINTF3("makeNewXMLTranscoder() encoding=%s blocksize=%d\n",localname,blockSize);
 
    if (gForceTranscode == MUST_USE_ICU) {
       if (gViewTranscoder)
          printf("IXM1001I XML - Using ICU - %s\n",localname);
-      return fICUService->makeNewXMLTranscoder(encodingName,resValue,blockSize);
+      return fICUService->makeNewXMLTranscoder(encodingName,resValue,blockSize, manager);
    }
 
    uniconvconverter *tconv=addConverter(localname,resValue);
@@ -493,13 +494,13 @@ DBGPRINTF3("makeNewXMLTranscoder() encoding=%s blocksize=%d\n",localname,blockSi
       else {
          if (gViewTranscoder)
             printf("IXM1002I XML - Using ICU - %s\n",localname);
-         return fICUService->makeNewXMLTranscoder(encodingName,resValue,blockSize);
+         return fICUService->makeNewXMLTranscoder(encodingName,resValue,blockSize, manager);
       }
    }
 
    if (gViewTranscoder)
       printf("IXM1003I XML - Using Unicode Services - %s\n",localname);
-   return new Uniconv390Transcoder(encodingName, tconv, blockSize);
+   return new (manager) Uniconv390Transcoder(encodingName, tconv, blockSize);
 }
 
 
@@ -772,6 +773,61 @@ char* Uniconv390LCPTranscoder::transcode(const XMLCh* const toTranscode)
    return retVal;
 }
 
+char* Uniconv390LCPTranscoder::transcode(const XMLCh* const toTranscode,
+                                         MemoryManager* const manager)
+{
+//printf("Uniconv390LCPTranscoder::transcode(const XMLCh* const toTranscode) ");
+//printf("transcode handle=%x\n",fConverter->fIconv390DescriptorTo);
+   if (!toTranscode)
+      return 0;
+
+   char* retVal = 0;
+    // find out the length of the source and use this as an estimate for the needed buffer length.
+   unsigned int  wLent = getWideCharLength(toTranscode);
+   if (wLent == 0) {
+      retVal = (char*) manager->allocate(sizeof(char));//new char[1];
+      retVal[0] = 0;
+      return retVal;
+   }
+   retVal = (char*) manager->allocate((wLent * 2 + 1) * sizeof(char));//new char[wLent * 2 + 1]; // get double just to be sure.
+   while (true) {
+      int retCode;
+      char *tmpInPtr = (char*) toTranscode;
+      char *tmpOutPtr = (char*) retVal;
+      unsigned int inByteLeft = wLent*sizeof(XMLCh);
+      unsigned int outByteLeft = wLent*sizeof(XMLCh);
+//printf("!!!transcode len=%d\n",wLent);
+
+      { // Locking scope
+         XMLMutexLock lockConverter(&fConverter->fMutex);
+         retCode = uniconv(fConverter->fIconv390DescriptorTo, &tmpInPtr, &inByteLeft, &tmpOutPtr, &outByteLeft);
+      }
+//printf("!!!transcode uniconv finished rc=%d errno=%d\n",retCode,errno);
+      // If the data does not fit into our estimation of the buffer size, then delete the buffer,
+      // double the estimated length and try again.
+      if ( ((retCode < 0) && (errno == E2BIG)) || (outByteLeft == 0) ) {
+//printf("!!!Uniconv390LCPTranscoder::transcode(const XMLCh* const toTranscode):Retrying with a bigger buffer.......\n");
+         manager->deallocate(retVal);//delete [] retVal;
+         wLent*=2;
+         retVal = (char*) manager->allocate
+         (
+             (wLent*sizeof(XMLCh) + 1) * sizeof(char)
+         );//new char[wLent*sizeof(XMLCh) + 1];
+      }
+      // If uniconv doesn't complete for any other reason, then return failure.
+      else if (retCode < 0) {
+         return 0;
+      }
+      // it was successful so break out of the loop
+      else {
+         *tmpOutPtr = 0x00;
+         break;
+      }
+   }
+//printf("Uniconv390LCPTranscoder::transcode(const XMLCh* const toTranscode):%s\n",retVal);
+   return retVal;
+}
+
 XMLCh* Uniconv390LCPTranscoder::transcode(const char* const toTranscode)
 {
 DBGPRINTF2("Uniconv390LCPTranscoder::transcode(const char* const toTranscode):%s \n",toTranscode);
@@ -808,6 +864,43 @@ DBGPRINTF2("Uniconv390LCPTranscoder::transcode(const char* const toTranscode):%s
    return retVal;
 }
 
+XMLCh* Uniconv390LCPTranscoder::transcode(const char* const toTranscode,
+                                          MemoryManager* const manager)
+{
+DBGPRINTF2("Uniconv390LCPTranscoder::transcode(const char* const toTranscode):%s \n",toTranscode);
+//printf("transcode handle=%x\n",fConverter->fIconv390DescriptorFrom);
+   if (!toTranscode)
+      return 0;
+
+   XMLCh* retVal = 0;
+   const unsigned int len = strlen(toTranscode);
+   retVal = (XMLCh*) manager->allocate((len + 1) * sizeof(XMLCh));//new XMLCh[len + 1]; // +1 is for the null terminator!
+   if (len == 0) {
+      retVal[0] = 0;
+      return retVal;
+   }
+
+   int retCode;
+   char *tmpInPtr = (char*) toTranscode;
+   char *tmpOutPtr = (char*) retVal;
+   unsigned int inByteLeft = len;
+   unsigned int outByteLeft = len*sizeof(XMLCh);
+   { // locking scope
+      XMLMutexLock lockConverter(&fConverter->fMutex);
+      retCode = uniconv(fConverter->fIconv390DescriptorFrom, &tmpInPtr, &inByteLeft, &tmpOutPtr, &outByteLeft);
+   }
+   // Because we check the length in the beginning, and we make sure the output buffer
+   // is big enough, uniconv should complete the transcoding. If it doesn't for any reason, then
+   // return failure.
+   if (retCode < 0) {
+      manager->deallocate(retVal);//delete [] retVal;
+      return 0;
+   }
+   *tmpOutPtr = 0x00;
+   *(tmpOutPtr+1) = 0x00;
+   return retVal;
+}
+
 
 bool Uniconv390LCPTranscoder::transcode(const  char* const     toTranscode
                                 ,       XMLCh* const    toFill
diff --git a/src/xercesc/util/Transcoders/Uniconv390/Uniconv390TransService.hpp b/src/xercesc/util/Transcoders/Uniconv390/Uniconv390TransService.hpp
index 70440a664..7ffbafb8e 100644
--- a/src/xercesc/util/Transcoders/Uniconv390/Uniconv390TransService.hpp
+++ b/src/xercesc/util/Transcoders/Uniconv390/Uniconv390TransService.hpp
@@ -126,6 +126,7 @@ protected :
         const   XMLCh* const            encodingName
         ,       XMLTransService::Codes& resValue
         , const unsigned int            blockSize
+        ,       MemoryManager* const    manager
     );
 
 
@@ -227,8 +228,12 @@ public :
     virtual unsigned int calcRequiredSize(const XMLCh* const srcText);
 
     virtual char* transcode(const XMLCh* const toTranscode);
+    virtual char* transcode(const XMLCh* const toTranscode,
+                            MemoryManager* const manager);
 
     virtual XMLCh* transcode(const char* const toTranscode);
+    virtual XMLCh* transcode(const char* const toTranscode,
+                             MemoryManager* const manager);
 
     virtual bool transcode
     (
diff --git a/src/xercesc/util/Transcoders/Win32/Win32TransService.cpp b/src/xercesc/util/Transcoders/Win32/Win32TransService.cpp
index 9d960b277..ab73a9bd7 100644
--- a/src/xercesc/util/Transcoders/Win32/Win32TransService.cpp
+++ b/src/xercesc/util/Transcoders/Win32/Win32TransService.cpp
@@ -537,7 +537,8 @@ bool Win32TransService::isAlias(const   HKEY            encodingKey
 XMLTranscoder*
 Win32TransService::makeNewXMLTranscoder(const   XMLCh* const            encodingName
                                         ,       XMLTransService::Codes& resValue
-                                        , const unsigned int            blockSize)
+                                        , const unsigned int            blockSize
+                                        ,       MemoryManager* const    manager)
 {
     const unsigned int upLen = 1024;
     XMLCh upEncoding[upLen + 1];
@@ -561,7 +562,7 @@ Win32TransService::makeNewXMLTranscoder(const   XMLCh* const            encoding
     }
 
     // We found it, so return a Win32 transcoder for this encoding
-    return new Win32Transcoder
+    return new (manager) Win32Transcoder
     (
         encodingName
         , theEntry->getWinCP()
@@ -902,6 +903,35 @@ char* Win32LCPTranscoder::transcode(const XMLCh* const toTranscode)
     return retVal;
 }
 
+char* Win32LCPTranscoder::transcode(const XMLCh* const toTranscode,
+                                    MemoryManager* const manager)
+{
+    if (!toTranscode)
+        return 0;
+
+    char* retVal = 0;
+    if (*toTranscode)
+    {
+        // Calc the needed size
+        const unsigned int neededLen = ::wcstombs(0, toTranscode, 0);
+        if (neededLen == (unsigned int)-1)
+            return 0;
+
+        // Allocate a buffer of that size plus one for the null and transcode
+        retVal = (char*) manager->allocate((neededLen + 1) * sizeof(char)); //new char[neededLen + 1];
+        ::wcstombs(retVal, toTranscode, neededLen + 1);
+
+        // And cap it off anyway just to make sure
+        retVal[neededLen] = 0;
+    }
+     else
+    {
+        retVal = (char*) manager->allocate(sizeof(char)); //new char[1];
+        retVal[0] = 0;
+    }
+    return retVal;
+}
+
 
 XMLCh* Win32LCPTranscoder::transcode(const char* const toTranscode)
 {
@@ -935,6 +965,39 @@ XMLCh* Win32LCPTranscoder::transcode(const char* const toTranscode)
     return retVal;
 }
 
+XMLCh* Win32LCPTranscoder::transcode(const char* const toTranscode,
+                                     MemoryManager* const manager)
+{
+    if (!toTranscode)
+        return 0;
+
+    XMLCh* retVal = 0;
+    if (*toTranscode)
+    {
+        // Calculate the buffer size required
+        const unsigned int neededLen = calcRequiredSize(toTranscode);
+        if (neededLen == 0)
+        {
+            retVal = (XMLCh*) manager->allocate(sizeof(XMLCh)); //new XMLCh[1];
+            retVal[0] = 0;
+            return retVal;
+        }
+
+        // Allocate a buffer of that size plus one for the null and transcode
+        retVal = (XMLCh*) manager->allocate((neededLen + 1) * sizeof(XMLCh)); //new XMLCh[neededLen + 1];
+        ::mbstowcs(retVal, toTranscode, neededLen + 1);
+
+        // Cap it off just to make sure. We are so paranoid!
+        retVal[neededLen] = 0;
+    }
+     else
+    {
+        retVal = (XMLCh*) manager->allocate(sizeof(XMLCh*)); //new XMLCh[1];
+        retVal[0] = 0;
+    }
+    return retVal;
+}
+
 
 bool Win32LCPTranscoder::transcode( const   char* const     toTranscode
                                     ,       XMLCh* const    toFill
diff --git a/src/xercesc/util/Transcoders/Win32/Win32TransService.hpp b/src/xercesc/util/Transcoders/Win32/Win32TransService.hpp
index 40b73d878..d29814b31 100644
--- a/src/xercesc/util/Transcoders/Win32/Win32TransService.hpp
+++ b/src/xercesc/util/Transcoders/Win32/Win32TransService.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.5  2003/05/15 18:47:07  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.4  2003/03/07 18:15:58  tng
  * Return a reference instead of void for operator=
  *
@@ -177,6 +180,7 @@ protected :
         const   XMLCh* const            encodingName
         ,       XMLTransService::Codes& resValue
         , const unsigned int            blockSize
+        ,       MemoryManager* const    manager
     );
 
 
@@ -309,8 +313,12 @@ public :
     virtual unsigned int calcRequiredSize(const XMLCh* const srcText);
 
     virtual char* transcode(const XMLCh* const toTranscode);
+    virtual char* transcode(const XMLCh* const toTranscode,
+                            MemoryManager* const manager);
 
     virtual XMLCh* transcode(const char* const toTranscode);
+    virtual XMLCh* transcode(const char* const toTranscode,
+                             MemoryManager* const manager);
 
     virtual bool transcode
     (
diff --git a/src/xercesc/util/regx/BMPattern.cpp b/src/xercesc/util/regx/BMPattern.cpp
index bad554bef..0b230ec74 100644
--- a/src/xercesc/util/regx/BMPattern.cpp
+++ b/src/xercesc/util/regx/BMPattern.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.3  2003/05/15 18:42:54  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.2  2002/11/04 15:17:00  tng
  * C++ Namespace Support.
  *
@@ -76,20 +79,26 @@
 #include <xercesc/util/regx/BMPattern.hpp>
 #include <xercesc/util/XMLString.hpp>
 #include <xercesc/util/Janitor.hpp>
+#include <xercesc/framework/MemoryManager.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
 // ---------------------------------------------------------------------------
 //  BMPattern: Constructors
 // ---------------------------------------------------------------------------
-BMPattern::BMPattern(const XMLCh* const pattern, bool ignoreCase)
-	:fPattern(XMLString::replicate(pattern)),
-	 fUppercasePattern(0),
-	 fIgnoreCase(ignoreCase),
-	 fShiftTable(0),
-	 fShiftTableLen(256) {
-
+BMPattern::BMPattern( const XMLCh*         const pattern
+                    ,       bool                 ignoreCase
+                    ,       MemoryManager* const manager) :
+
+    fIgnoreCase(ignoreCase)
+    , fShiftTableLen(256)
+    , fShiftTable(0)
+    , fPattern(0)
+    , fUppercasePattern(0)
+    , fMemoryManager(manager)
+{
 	try {
+        fPattern = XMLString::replicate(pattern, fMemoryManager);
 		initialize();
 	}
 	catch(...) {
@@ -99,14 +108,20 @@ BMPattern::BMPattern(const XMLCh* const pattern, bool ignoreCase)
 	}
 }
 
-BMPattern::BMPattern(const XMLCh* const pattern, int tableSize, bool ignoreCase)
-	:fPattern(XMLString::replicate(pattern)),
-	 fUppercasePattern(0),
-	 fIgnoreCase(ignoreCase),
-	 fShiftTable(0),
-	 fShiftTableLen(tableSize) {
-	
+BMPattern::BMPattern( const XMLCh*         const pattern
+                    ,       int                  tableSize
+                    ,       bool                 ignoreCase
+                    ,       MemoryManager* const manager) :
+
+    fIgnoreCase(ignoreCase)
+    , fShiftTableLen(tableSize)
+    , fShiftTable(0)
+    , fPattern(0)
+    , fUppercasePattern(0)
+    , fMemoryManager(manager)
+{
 	try {
+        fPattern = XMLString::replicate(pattern, fMemoryManager);
 		initialize();
 	}
 	catch(...) {
@@ -135,11 +150,11 @@ int BMPattern::matches(const XMLCh* const content, int start, int limit) {
 
 	if (fIgnoreCase) {
 		
-		ucContent = XMLString::replicate(content);
+		ucContent = XMLString::replicate(content, fMemoryManager);
 		XMLString::upperCase(ucContent);
 	}
 
-	ArrayJanitor<XMLCh> janUCContent(ucContent);
+	ArrayJanitor<XMLCh> janUCContent(ucContent, fMemoryManager);
 
 	int index = start + patternLen;
 
@@ -184,17 +199,17 @@ void BMPattern::initialize() {
 	const unsigned int	patternLen = XMLString::stringLen(fPattern);
 	XMLCh* lowercasePattern = 0;
 
-	fShiftTable = new int[fShiftTableLen];
+	fShiftTable = (int*) fMemoryManager->allocate(fShiftTableLen*sizeof(int)); //new int[fShiftTableLen];
 
 	if (fIgnoreCase) {
 
-		fUppercasePattern = XMLString::replicate(fPattern);
-		lowercasePattern = XMLString::replicate(fPattern);
+		fUppercasePattern = XMLString::replicate(fPattern, fMemoryManager);
+		lowercasePattern = XMLString::replicate(fPattern, fMemoryManager);
 		XMLString::upperCase(fUppercasePattern);
 		XMLString::lowerCase(lowercasePattern);
 	}
 
-	ArrayJanitor<XMLCh> janLowercase(lowercasePattern);
+	ArrayJanitor<XMLCh> janLowercase(lowercasePattern, fMemoryManager);
 
 	for (unsigned int i=0; i< fShiftTableLen; i++)
 		fShiftTable[i] = patternLen;
@@ -222,6 +237,16 @@ void BMPattern::initialize() {
 	}
 }
 
+// ---------------------------------------------------------------------------
+//  BMPattern: Cleanup
+// ---------------------------------------------------------------------------
+void BMPattern::cleanUp() {
+
+    fMemoryManager->deallocate(fPattern);//delete [] fPattern;
+    fMemoryManager->deallocate(fUppercasePattern);//delete [] fUppercasePattern;
+    fMemoryManager->deallocate(fShiftTable);
+}
+
 XERCES_CPP_NAMESPACE_END
 
 /**
diff --git a/src/xercesc/util/regx/BMPattern.hpp b/src/xercesc/util/regx/BMPattern.hpp
index aed51880d..9ae02526a 100644
--- a/src/xercesc/util/regx/BMPattern.hpp
+++ b/src/xercesc/util/regx/BMPattern.hpp
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 2001 The Apache Software Foundation.  All rights
+ * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -63,11 +63,13 @@
 // ---------------------------------------------------------------------------
 //  Includes
 // ---------------------------------------------------------------------------
-#include <xercesc/util/XercesDefs.hpp>
+#include <xercesc/util/XMemory.hpp>
+#include <xercesc/util/PlatformUtils.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
-class XMLUTIL_EXPORT BMPattern {
+class XMLUTIL_EXPORT BMPattern : public XMemory
+{
 public:
 	// -----------------------------------------------------------------------
 	//  Public Constructors and Destructor
@@ -83,8 +85,15 @@ public:
       *
       * @param  ignoreCase  A flag to indicate whether to ignore case
 	  *						matching or not.
+      *
+      * @param  manager     The configurable memory manager
       */
-	BMPattern(const XMLCh* const pattern, bool ignoreCase);
+	BMPattern
+    (
+        const XMLCh* const pattern
+        , bool ignoreCase
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
 	/**
       * This is the constructor which takes all of the information
@@ -96,8 +105,16 @@ public:
 	  *
       * @param  ignoreCase  A flag to indicate whether to ignore case
 	  *						matching or not.
+      *
+      * @param  manager     The configurable memory manager
       */
-	BMPattern(const XMLCh* const pattern, int tableSize, bool ignoreCase);
+	BMPattern
+    (
+        const XMLCh* const pattern
+        , int tableSize
+        , bool ignoreCase
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
 	//@}
 
@@ -160,23 +177,14 @@ private :
     //      This is a table of offsets for shifting purposes used by the BM
 	//		search algorithm, and its length.
     // -----------------------------------------------------------------------
-	XMLCh*			fPattern;
-	XMLCh*			fUppercasePattern;
-	bool			fIgnoreCase;
-	int*			fShiftTable;
-	unsigned int	fShiftTableLen;
+	bool           fIgnoreCase;
+	unsigned int   fShiftTableLen;
+	int*           fShiftTable;
+	XMLCh*         fPattern;
+	XMLCh*         fUppercasePattern;
+    MemoryManager* fMemoryManager; 
 };
 
-// ---------------------------------------------------------------------------
-//  BMPattern: Cleanup
-// ---------------------------------------------------------------------------
-inline void BMPattern::cleanUp() {
-
-	delete [] fPattern;
-	delete [] fUppercasePattern;
-	delete [] fShiftTable;
-}
-
 XERCES_CPP_NAMESPACE_END
 
 #endif
diff --git a/src/xercesc/util/regx/Match.hpp b/src/xercesc/util/regx/Match.hpp
index 4a4e507fc..9a6e84555 100644
--- a/src/xercesc/util/regx/Match.hpp
+++ b/src/xercesc/util/regx/Match.hpp
@@ -72,7 +72,8 @@ XERCES_CPP_NAMESPACE_BEGIN
 /**
   * An instance of this class has ranges captured in matching
   */
-class XMLUTIL_EXPORT Match {
+  class XMLUTIL_EXPORT Match : public XMemory
+{
 public:
 
 	// -----------------------------------------------------------------------
diff --git a/src/xercesc/util/regx/Op.hpp b/src/xercesc/util/regx/Op.hpp
index 1259b1127..d224f14a0 100644
--- a/src/xercesc/util/regx/Op.hpp
+++ b/src/xercesc/util/regx/Op.hpp
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 2001 The Apache Software Foundation.  All rights
+ * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -64,7 +64,6 @@
 // ---------------------------------------------------------------------------
 //  Includes
 // ---------------------------------------------------------------------------
-#include <xercesc/util/XercesDefs.hpp>
 #include <xercesc/util/RefVectorOf.hpp>
 #include <xercesc/util/RuntimeException.hpp>
 
@@ -76,7 +75,8 @@ XERCES_CPP_NAMESPACE_BEGIN
 class Token;
 
 
-class XMLUTIL_EXPORT Op {
+class XMLUTIL_EXPORT Op : public XMemory
+{
 public:
 
     enum {
diff --git a/src/xercesc/util/regx/OpFactory.cpp b/src/xercesc/util/regx/OpFactory.cpp
index 349b69446..86fdc7d08 100644
--- a/src/xercesc/util/regx/OpFactory.cpp
+++ b/src/xercesc/util/regx/OpFactory.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.4  2003/05/15 18:42:54  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/11/04 15:17:00  tng
  * C++ Namespace Support.
  *
@@ -81,6 +84,7 @@
 // ---------------------------------------------------------------------------
 #include <xercesc/util/regx/OpFactory.hpp>
 #include <xercesc/util/regx/Op.hpp>
+#include <xercesc/util/PlatformUtils.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -88,8 +92,10 @@ XERCES_CPP_NAMESPACE_BEGIN
 //  OpFactory: Constructors and Destructor
 // ---------------------------------------------------------------------------
 OpFactory::OpFactory() :
-    fOpVector(new RefVectorOf<Op>(16, true)) {
-
+    fOpVector(0)
+    , fMemoryManager(XMLPlatformUtils::fgMemoryManager)
+{
+    fOpVector = new (fMemoryManager) RefVectorOf<Op>(16, true);
 }
 
 OpFactory::~OpFactory() {
@@ -103,14 +109,14 @@ OpFactory::~OpFactory() {
 // ---------------------------------------------------------------------------
 Op* OpFactory::createDotOp() {
 
-	Op* tmpOp = new Op(Op::O_DOT);
+	Op* tmpOp = new (fMemoryManager) Op(Op::O_DOT);
 	fOpVector->addElement(tmpOp);
 	return tmpOp;
 }
 
 CharOp* OpFactory::createCharOp(int data) {
 
-	CharOp* tmpOp = new CharOp(Op::O_CHAR, data);
+	CharOp* tmpOp = new (fMemoryManager) CharOp(Op::O_CHAR, data);
 
 	fOpVector->addElement(tmpOp);
 	return tmpOp;
@@ -118,7 +124,7 @@ CharOp* OpFactory::createCharOp(int data) {
 
 CharOp* OpFactory::createAnchorOp(int data) {
 
-	CharOp* tmpOp = new CharOp(Op::O_ANCHOR, data);
+	CharOp* tmpOp = new (fMemoryManager) CharOp(Op::O_ANCHOR, data);
 
 	fOpVector->addElement(tmpOp);
 	return tmpOp;
@@ -126,7 +132,7 @@ CharOp* OpFactory::createAnchorOp(int data) {
 
 CharOp* OpFactory::createCaptureOp(int number, const Op* const next) {
 
-	CharOp* tmpOp = new CharOp(Op::O_CAPTURE, number);
+	CharOp* tmpOp = new (fMemoryManager) CharOp(Op::O_CAPTURE, number);
 
 	tmpOp->setNextOp(next);
 	fOpVector->addElement(tmpOp);
@@ -135,7 +141,7 @@ CharOp* OpFactory::createCaptureOp(int number, const Op* const next) {
 
 UnionOp* OpFactory::createUnionOp(int size) {
 
-	UnionOp* tmpOp = new UnionOp(Op::O_UNION, size);
+	UnionOp* tmpOp = new (fMemoryManager) UnionOp(Op::O_UNION, size);
 
 	fOpVector->addElement(tmpOp);
 	return tmpOp;
@@ -143,7 +149,7 @@ UnionOp* OpFactory::createUnionOp(int size) {
 
 ChildOp* OpFactory::createClosureOp(int id) {
 
-	ModifierOp* tmpOp = new ModifierOp(Op::O_CLOSURE, id, -1);
+	ModifierOp* tmpOp = new (fMemoryManager) ModifierOp(Op::O_CLOSURE, id, -1);
 
 	fOpVector->addElement(tmpOp);
 	return tmpOp;
@@ -151,7 +157,7 @@ ChildOp* OpFactory::createClosureOp(int id) {
 
 ChildOp* OpFactory::createNonGreedyClosureOp() {
 
-	ChildOp* tmpOp = new ChildOp(Op::O_NONGREEDYCLOSURE);
+	ChildOp* tmpOp = new (fMemoryManager) ChildOp(Op::O_NONGREEDYCLOSURE);
 
 	fOpVector->addElement(tmpOp);
 	return tmpOp;
@@ -159,7 +165,7 @@ ChildOp* OpFactory::createNonGreedyClosureOp() {
 
 ChildOp* OpFactory::createQuestionOp(bool nonGreedy) {
 
-	ChildOp* tmpOp = new ChildOp(nonGreedy ? Op::O_NONGREEDYQUESTION :
+	ChildOp* tmpOp = new (fMemoryManager)  ChildOp(nonGreedy ? Op::O_NONGREEDYQUESTION :
 											 Op::O_QUESTION);
 
 	fOpVector->addElement(tmpOp);
@@ -168,7 +174,7 @@ ChildOp* OpFactory::createQuestionOp(bool nonGreedy) {
 
 RangeOp* OpFactory::createRangeOp(const Token* const token) {
 
-	RangeOp* tmpOp = new RangeOp(Op::O_RANGE, token);
+	RangeOp* tmpOp = new (fMemoryManager)  RangeOp(Op::O_RANGE, token);
 	
 	fOpVector->addElement(tmpOp);
 	return tmpOp;
@@ -177,7 +183,7 @@ RangeOp* OpFactory::createRangeOp(const Token* const token) {
 ChildOp* OpFactory::createLookOp(const short type, const Op* const next,
 						         const Op* const branch) {
 
-	ChildOp* tmpOp = new ChildOp(type);
+	ChildOp* tmpOp = new (fMemoryManager) ChildOp(type);
 
 	tmpOp->setNextOp(next);
 	tmpOp->setChild(branch);
@@ -187,7 +193,7 @@ ChildOp* OpFactory::createLookOp(const short type, const Op* const next,
 
 CharOp* OpFactory::createBackReferenceOp(int refNo) {
 
-	CharOp* tmpOp = new CharOp(Op::O_BACKREFERENCE, refNo);
+	CharOp* tmpOp = new (fMemoryManager) CharOp(Op::O_BACKREFERENCE, refNo);
 
 	fOpVector->addElement(tmpOp);
 	return tmpOp;
@@ -195,7 +201,7 @@ CharOp* OpFactory::createBackReferenceOp(int refNo) {
 
 StringOp* OpFactory::createStringOp(const XMLCh* const literal) {
 
-	StringOp* tmpOp = new StringOp(Op::O_STRING, literal);
+	StringOp* tmpOp = new (fMemoryManager) StringOp(Op::O_STRING, literal);
 
 	fOpVector->addElement(tmpOp);
 	return tmpOp;
@@ -204,7 +210,7 @@ StringOp* OpFactory::createStringOp(const XMLCh* const literal) {
 ChildOp* OpFactory::createIndependentOp(const Op* const next,
 							            const Op* const branch) {
 
-	ChildOp* tmpOp = new ChildOp(Op::O_INDEPENDENT);
+	ChildOp* tmpOp = new (fMemoryManager) ChildOp(Op::O_INDEPENDENT);
 
 	tmpOp->setNextOp(next);
 	tmpOp->setChild(branch);
@@ -216,7 +222,7 @@ ModifierOp* OpFactory::createModifierOp(const Op* const next,
                                         const Op* const branch,
                                         const int add, const int mask) {
 
-	ModifierOp* tmpOp = new ModifierOp(Op::O_MODIFIER, add, mask);
+	ModifierOp* tmpOp = new (fMemoryManager) ModifierOp(Op::O_MODIFIER, add, mask);
 
 	tmpOp->setNextOp(next);
 	tmpOp->setChild(branch);
@@ -228,7 +234,7 @@ ConditionOp* OpFactory::createConditionOp(const Op* const next, const int ref,
 								          const Op* const yesFlow,
 								          const Op* const noFlow) {
 
-	ConditionOp* tmpOp = new ConditionOp(Op::O_CONDITION, ref, conditionFlow,
+	ConditionOp* tmpOp = new (fMemoryManager) ConditionOp(Op::O_CONDITION, ref, conditionFlow,
 										 yesFlow, noFlow);
 
 	tmpOp->setNextOp(next);
diff --git a/src/xercesc/util/regx/OpFactory.hpp b/src/xercesc/util/regx/OpFactory.hpp
index e2deac76a..75c723a8e 100644
--- a/src/xercesc/util/regx/OpFactory.hpp
+++ b/src/xercesc/util/regx/OpFactory.hpp
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 2001 The Apache Software Foundation.  All rights
+ * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -64,7 +64,7 @@
 // ---------------------------------------------------------------------------
 //  Includes
 // ---------------------------------------------------------------------------
-#include <xercesc/util/XMLUniDefs.hpp>
+#include <xercesc/util/XMemory.hpp>
 #include <xercesc/util/RefVectorOf.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
@@ -90,8 +90,8 @@ class Token;
  * all associated Op objects will be deleted.
  */
 
-class XMLUTIL_EXPORT OpFactory {
-
+class XMLUTIL_EXPORT OpFactory : public XMemory
+{
 public:
 	// -----------------------------------------------------------------------
     //  Constructors and destructors
@@ -146,6 +146,7 @@ private:
     //      Contains Op objects. Used for memory cleanup.
     // -----------------------------------------------------------------------
     RefVectorOf<Op>* fOpVector;
+    MemoryManager*   fMemoryManager;
 };
 
 // ---------------------------------------------------------------------------
diff --git a/src/xercesc/util/regx/ParserForXMLSchema.cpp b/src/xercesc/util/regx/ParserForXMLSchema.cpp
index e2a8378c1..2dc212862 100644
--- a/src/xercesc/util/regx/ParserForXMLSchema.cpp
+++ b/src/xercesc/util/regx/ParserForXMLSchema.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.6  2003/05/15 18:42:54  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.5  2003/03/18 19:38:28  knoaman
  * Schema Errata E2-18 + misc. regex fixes.
  *
@@ -114,14 +117,15 @@
 #include <xercesc/util/regx/RegxDefs.hpp>
 #include <xercesc/util/ParseException.hpp>
 #include <xercesc/util/RuntimeException.hpp>
+#include <xercesc/util/PlatformUtils.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
 // ---------------------------------------------------------------------------
 //  ParserForXMLSchema: Constructors and Destructors
 // ---------------------------------------------------------------------------
-ParserForXMLSchema::ParserForXMLSchema()
-    : RegxParser()
+ParserForXMLSchema::ParserForXMLSchema(MemoryManager* const manager)
+    : RegxParser(manager)
 {
 
 }
diff --git a/src/xercesc/util/regx/ParserForXMLSchema.hpp b/src/xercesc/util/regx/ParserForXMLSchema.hpp
index 1c4a1701f..646172569 100644
--- a/src/xercesc/util/regx/ParserForXMLSchema.hpp
+++ b/src/xercesc/util/regx/ParserForXMLSchema.hpp
@@ -79,7 +79,7 @@ public:
     // -----------------------------------------------------------------------
     //  Public Constructors and Destructor
     // -----------------------------------------------------------------------
-    ParserForXMLSchema();
+    ParserForXMLSchema(MemoryManager* const manager);
     ~ParserForXMLSchema();
 
     // -----------------------------------------------------------------------
diff --git a/src/xercesc/util/regx/RangeFactory.hpp b/src/xercesc/util/regx/RangeFactory.hpp
index fde574dda..8b183227d 100644
--- a/src/xercesc/util/regx/RangeFactory.hpp
+++ b/src/xercesc/util/regx/RangeFactory.hpp
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 2001 The Apache Software Foundation.  All rights
+ * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -64,12 +64,12 @@
 // ---------------------------------------------------------------------------
 //  Includes
 // ---------------------------------------------------------------------------
-#include <xercesc/util/XercesDefs.hpp>
+#include <xercesc/util/XMemory.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
-class XMLUTIL_EXPORT RangeFactory {
-
+class XMLUTIL_EXPORT RangeFactory : public XMemory
+{
 public:
     // -----------------------------------------------------------------------
     //  Constructors and destructors
diff --git a/src/xercesc/util/regx/RangeTokenMap.hpp b/src/xercesc/util/regx/RangeTokenMap.hpp
index 9f977e9cb..9960387bb 100644
--- a/src/xercesc/util/regx/RangeTokenMap.hpp
+++ b/src/xercesc/util/regx/RangeTokenMap.hpp
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 2001 The Apache Software Foundation.  All rights
+ * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -64,8 +64,8 @@
 // ---------------------------------------------------------------------------
 //  Includes
 // ---------------------------------------------------------------------------
-#include <xercesc/util/StringPool.hpp>
 #include <xercesc/util/Mutexes.hpp>
+#include <xercesc/util/RefHashTableOf.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -75,9 +75,10 @@ XERCES_CPP_NAMESPACE_BEGIN
 class RangeToken;
 class RangeFactory;
 class TokenFactory;
+class XMLStringPool;
 
-
-class XMLUTIL_EXPORT RangeTokenElemMap {
+class XMLUTIL_EXPORT RangeTokenElemMap : public XMemory
+{
 
 public:
     RangeTokenElemMap(unsigned int categoryId);
@@ -109,8 +110,8 @@ private:
 };
 
 
-class XMLUTIL_EXPORT RangeTokenMap {
-
+class XMLUTIL_EXPORT RangeTokenMap : public XMemory
+{
 public:
     // -----------------------------------------------------------------------
     //  Putter methods
diff --git a/src/xercesc/util/regx/RegularExpression.cpp b/src/xercesc/util/regx/RegularExpression.cpp
index 4a39a38e5..a9385f944 100644
--- a/src/xercesc/util/regx/RegularExpression.cpp
+++ b/src/xercesc/util/regx/RegularExpression.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.8  2003/05/15 18:42:54  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.7  2003/05/12 10:08:22  gareth
  * The correct file this time.
  *
@@ -119,6 +122,7 @@
 #include <xercesc/util/regx/ParserForXMLSchema.hpp>
 #include <xercesc/util/Janitor.hpp>
 #include <xercesc/util/ParseException.hpp>
+#include <xercesc/util/IllegalArgumentException.hpp>
 #include <xercesc/framework/XMLBuffer.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
@@ -357,7 +361,7 @@ void RegularExpression::setPattern(const XMLCh* const pattern,
 	fPattern = XMLString::replicate(pattern);
 
 	RegxParser* regxParser = isSet(fOptions, XMLSCHEMA_MODE)
-		? new ParserForXMLSchema() : new RegxParser();
+		? new ParserForXMLSchema(XMLPlatformUtils::fgMemoryManager) : new RegxParser(XMLPlatformUtils::fgMemoryManager);
 
     if (regxParser) {
         regxParser->setTokenFactory(fTokenFactory);
diff --git a/src/xercesc/util/regx/RegularExpression.hpp b/src/xercesc/util/regx/RegularExpression.hpp
index 26b047455..71d82483c 100644
--- a/src/xercesc/util/regx/RegularExpression.hpp
+++ b/src/xercesc/util/regx/RegularExpression.hpp
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 2001 The Apache Software Foundation.  All rights
+ * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -64,14 +64,13 @@
 // ---------------------------------------------------------------------------
 //  Includes
 // ---------------------------------------------------------------------------
-#include <xercesc/util/XMLUniDefs.hpp>
 #include <xercesc/util/RefArrayVectorOf.hpp>
 #include <xercesc/util/XMLString.hpp>
+#include <xercesc/util/Janitor.hpp>
+#include <xercesc/util/Mutexes.hpp>
 #include <xercesc/util/regx/Op.hpp>
 #include <xercesc/util/regx/TokenFactory.hpp>
 #include <xercesc/util/regx/BMPattern.hpp>
-#include <xercesc/util/Janitor.hpp>
-#include <xercesc/util/Mutexes.hpp>
 #include <xercesc/util/regx/ModifierToken.hpp>
 #include <xercesc/util/regx/ConditionToken.hpp>
 #include <xercesc/util/regx/OpFactory.hpp>
@@ -81,13 +80,11 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  Forward Declaration
 // ---------------------------------------------------------------------------
-class Token;
-class BMPattern;
 class RangeToken;
 class Match;
-class TokenFactory;
 
-class XMLUTIL_EXPORT RegularExpression {
+class XMLUTIL_EXPORT RegularExpression : public XMemory
+{
 public:
     // -----------------------------------------------------------------------
     //  Public Constructors and Destructor
@@ -168,7 +165,7 @@ private:
     // -----------------------------------------------------------------------
     //  Private data types
     // -----------------------------------------------------------------------
-    class XMLUTIL_EXPORT Context
+    class XMLUTIL_EXPORT Context : public XMemory
     {
         public :
             Context();
diff --git a/src/xercesc/util/regx/RegxParser.cpp b/src/xercesc/util/regx/RegxParser.cpp
index f946438c0..d6b000ae4 100644
--- a/src/xercesc/util/regx/RegxParser.cpp
+++ b/src/xercesc/util/regx/RegxParser.cpp
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 2001 The Apache Software Foundation.  All rights
+ * Copyright (c) 2003 The Apache Software Foundation.  All rights
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.7  2003/05/15 18:42:55  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.6  2003/03/18 19:38:28  knoaman
  * Schema Errata E2-18 + misc. regex fixes.
  *
@@ -122,14 +125,13 @@
 //  Includes
 // ---------------------------------------------------------------------------
 #include <xercesc/util/regx/RegxParser.hpp>
-#include <xercesc/util/PlatformUtils.hpp>
 #include <xercesc/util/XMLString.hpp>
+#include <xercesc/util/ParseException.hpp>
 #include <xercesc/util/regx/RegularExpression.hpp>
 #include <xercesc/util/regx/RegxUtil.hpp>
 #include <xercesc/util/regx/RegxDefs.hpp>
 #include <xercesc/util/regx/TokenInc.hpp>
 #include <xercesc/framework/XMLErrorCodes.hpp>
-#include <xercesc/util/ParseException.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -144,7 +146,7 @@ const unsigned short RegxParser::S_INXBRACKETS	= 2;
 //  RegxParser::ReferencePostion: Constructors and Destructor
 // ---------------------------------------------------------------------------
 RegxParser::ReferencePosition::ReferencePosition(const int refNo,
-												 const int position)
+						 const int position)
 	:fReferenceNo(refNo)
 	, fPosition(position)
 {
@@ -154,8 +156,9 @@ RegxParser::ReferencePosition::ReferencePosition(const int refNo,
 // ---------------------------------------------------------------------------
 //  RegxParser: Constructors and Destructors
 // ---------------------------------------------------------------------------
-RegxParser::RegxParser()
-    :fHasBackReferences(false),
+RegxParser::RegxParser(MemoryManager* const manager)
+    :fMemoryManager(manager),
+     fHasBackReferences(false),
      fOptions(0),
      fOffset(0),
      fNoGroups(1),
@@ -171,7 +174,7 @@ RegxParser::RegxParser()
 
 RegxParser::~RegxParser() {
 
-	delete [] fString;
+	fMemoryManager->deallocate(fString);//delete [] fString;
 	delete fReferences;
 }
 
@@ -193,13 +196,15 @@ Token* RegxParser::parse(const XMLCh* const regxStr, const int options) {
 	fNoGroups = 1;
 	fHasBackReferences = false;
 	setParseContext(S_NORMAL);
-	delete [] fString;
-	fString = XMLString::replicate(regxStr);
+	if (fString)
+        fMemoryManager->deallocate(fString);//delete [] fString;
+	fString = XMLString::replicate(regxStr, fMemoryManager);
 
 	if (isSet(RegularExpression::EXTENDED_COMMENT)) {
 
-        delete [] fString;
-		fString = RegxUtil::stripExtendedComment(regxStr);
+        if (fString)
+            fMemoryManager->deallocate(fString);//delete [] fString;
+		fString = RegxUtil::stripExtendedComment(regxStr, fMemoryManager);
     }
 
     fStringLen = XMLString::stringLen(fString);
@@ -648,10 +653,10 @@ Token* RegxParser::processCondition() {
         fHasBackReferences =  true;
 
         if (fReferences == 0) {
-            this->fReferences = new RefVectorOf<ReferencePosition>(8, true);
+            this->fReferences = new (fMemoryManager) RefVectorOf<ReferencePosition>(8, true);
         }
 
-        fReferences->addElement(new ReferencePosition(refNo, fOffset));
+        fReferences->addElement(new (fMemoryManager) ReferencePosition(refNo, fOffset));
         fOffset++;
 
         if (fString[fOffset] != chCloseParen)
@@ -840,10 +845,10 @@ Token* RegxParser::processBackReference() {
 
     fHasBackReferences = true;
     if (fReferences == 0) {
-        fReferences = new RefVectorOf<ReferencePosition>(8, true);
+        fReferences = new (fMemoryManager) RefVectorOf<ReferencePosition>(8, true);
     }
 
-    fReferences->addElement(new ReferencePosition(refNo, fOffset - 2));
+    fReferences->addElement(new (fMemoryManager) ReferencePosition(refNo, fOffset - 2));
     processNext();
     return tok;
 }
@@ -1090,8 +1095,11 @@ RangeToken* RegxParser::processBacksolidus_pP(const XMLInt32 ch) {
         ThrowXML(ParseException,XMLExcepts::Parser_Atom3);
     
     fOffset = nameEnd + 1;
-    XMLCh* rangeName = new XMLCh[(nameEnd - nameStart) + 1];
-    ArrayJanitor<XMLCh> janRangeName(rangeName);
+    XMLCh* rangeName = (XMLCh*) fMemoryManager->allocate
+    (
+        (nameEnd - nameStart + 1) * sizeof(XMLCh)
+    );//new XMLCh[(nameEnd - nameStart) + 1];
+    ArrayJanitor<XMLCh> janRangeName(rangeName, fMemoryManager);
     XMLString::subString(rangeName, fString, nameStart, nameEnd);
 
     return  fTokenFactory->getRange(rangeName, !(ch == chLatin_p));
@@ -1199,8 +1207,11 @@ RangeToken* RegxParser::parseCharacterClass(const bool useNRange) {
                 positive = false;
             }
 
-			XMLCh* name = new XMLCh[(nameEnd - fOffset) + 1];
-			ArrayJanitor<XMLCh> janName(name);
+			XMLCh* name = (XMLCh*) fMemoryManager->allocate
+            (
+                (nameEnd - fOffset + 1) * sizeof(XMLCh)
+            );//new XMLCh[(nameEnd - fOffset) + 1];
+			ArrayJanitor<XMLCh> janName(name, fMemoryManager);
 
 			XMLString::subString(name, fString, fOffset, nameEnd);
             RangeToken* rangeTok = fTokenFactory->getRange(name, !positive);
diff --git a/src/xercesc/util/regx/RegxParser.hpp b/src/xercesc/util/regx/RegxParser.hpp
index ee96324ab..db98b10de 100644
--- a/src/xercesc/util/regx/RegxParser.hpp
+++ b/src/xercesc/util/regx/RegxParser.hpp
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 2001 The Apache Software Foundation.  All rights
+ * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -80,7 +80,8 @@ class Token;
 class RangeToken;
 class TokenFactory;
 
-class XMLUTIL_EXPORT RegxParser {
+class XMLUTIL_EXPORT RegxParser : public XMemory
+{
 public:
 
 	// -----------------------------------------------------------------------
@@ -122,7 +123,7 @@ public:
 	// -----------------------------------------------------------------------
     //  Public Constructors and Destructor
     // -----------------------------------------------------------------------
-	RegxParser();
+	RegxParser(MemoryManager* const manager);
 	virtual ~RegxParser();
 
     // -----------------------------------------------------------------------
@@ -206,7 +207,7 @@ private:
 	// -----------------------------------------------------------------------
     //  Private data types
     // -----------------------------------------------------------------------
-    class ReferencePosition
+    class ReferencePosition : public XMemory
     {
         public :
             ReferencePosition(const int refNo, const int position);
@@ -224,6 +225,7 @@ private:
 	// -----------------------------------------------------------------------
     //  Private data members
 	// -----------------------------------------------------------------------
+    MemoryManager*                  fMemoryManager;
 	bool                            fHasBackReferences;
 	int                             fOptions;
 	int                             fOffset;
diff --git a/src/xercesc/util/regx/RegxUtil.cpp b/src/xercesc/util/regx/RegxUtil.cpp
index b67102c93..fec10cb0e 100644
--- a/src/xercesc/util/regx/RegxUtil.cpp
+++ b/src/xercesc/util/regx/RegxUtil.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.3  2003/05/15 18:42:55  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.2  2002/11/04 15:17:00  tng
  * C++ Namespace Support.
  *
@@ -77,7 +80,7 @@
 //  Includes
 // ---------------------------------------------------------------------------
 #include <xercesc/util/regx/RegxUtil.hpp>
-#include <xercesc/framework/XMLBuffer.hpp>
+#include <xercesc/util/XMLString.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -94,59 +97,60 @@ XMLCh* RegxUtil::decomposeToSurrogates(XMLInt32 ch) {
 }
 
 
-XMLCh* RegxUtil::stripExtendedComment(const XMLCh* const expression) {
+XMLCh* RegxUtil::stripExtendedComment(const XMLCh* const expression,
+                                      MemoryManager* const manager) {
 
-	unsigned int strLen = XMLString::stringLen(expression);
+    XMLCh* buffer = (manager) ? XMLString::replicate(expression)
+                              : XMLString::replicate(expression, manager);
 
-	if (strLen == 0)
-		return 0;
+    if (buffer)
+    {
+        const XMLCh* inPtr = expression;
+        XMLCh* outPtr = buffer;
 
-	XMLBuffer buffer;
-	unsigned int offset = 0;
+        while (*inPtr) {
 
-	while (offset < strLen) {
+            XMLCh ch = *inPtr++;
 
-		XMLCh ch = expression[offset++];
+            if (ch == chFF || ch == chCR || ch == chLF
+                || ch == chSpace || ch == chHTab) {
+                continue;
+            }
 
-		if (ch == chFF || ch == chCR || ch == chLF
-			|| ch == chSpace || ch == chHTab) {
-			continue;
-		}
+		    // Skips chracters between '#' and a line end.
+		    if (ch == chPound) {
 
-		// Skips chracters between '#' and a line end.
-		if (ch == chPound) {
+                while (*inPtr) {
 
-			while (offset < strLen) {
+                    ch = *inPtr++;
+                    if (ch == chLF || ch == chCR)
+                        break;
+                }
 
-				ch = expression[offset++];
-				if (ch == chLF || ch == chCR)
-					break;
-			}
-			continue;
-		}
+                continue;
+            }
 
-		XMLCh next;
-		if (ch == chBackSlash && offset < strLen) {
+            if (ch == chBackSlash && *inPtr) {
 
-			if ((next = expression[offset]) == chPound
-				|| next == chHTab || next == chLF || next == chFF
-				|| next == chCR || next == chSpace) {
+			    if ((ch = *inPtr++) == chPound || ch == chHTab || ch == chLF
+                    || ch == chFF || ch == chCR || ch == chSpace) {
+                    *outPtr++ = ch;
+                }
+                else { // Other escaped character.
 
-				buffer.append(next);
-				offset++;
-			} else {                         // Other escaped character.
+                    *outPtr++ = chBackSlash;
+                    *outPtr++ = ch;
+                }
+            }
+            else { // As is.
+                *outPtr++ = ch;
+            }
+        }
 
-				buffer.append(chBackSlash);
-				buffer.append(next);
-				offset++;
-			}
-		}
-		else {                             // As is.
-			buffer.append(ch);
-		}
-	}
+        *outPtr = chNull; // null terminate
+    }
 
-	return XMLString::replicate(buffer.getRawBuffer());
+    return buffer;
 }
 
 XERCES_CPP_NAMESPACE_END
diff --git a/src/xercesc/util/regx/RegxUtil.hpp b/src/xercesc/util/regx/RegxUtil.hpp
index 9788a1836..973ede186 100644
--- a/src/xercesc/util/regx/RegxUtil.hpp
+++ b/src/xercesc/util/regx/RegxUtil.hpp
@@ -64,11 +64,13 @@
 // ---------------------------------------------------------------------------
 //  Includes
 // ---------------------------------------------------------------------------
-#include <xercesc/util/XMLString.hpp>
 #include <xercesc/util/XMLUniDefs.hpp>
 
+
 XERCES_CPP_NAMESPACE_BEGIN
 
+class MemoryManager;
+
 class XMLUTIL_EXPORT RegxUtil {
 public:
 
@@ -83,7 +85,8 @@ public:
 	static bool isLowSurrogate(const XMLCh ch);
 	static bool isHighSurrogate(const XMLCh ch);
 	static XMLCh* decomposeToSurrogates(XMLInt32 ch);
-	static XMLCh* stripExtendedComment(const XMLCh* const expression);
+	static XMLCh* stripExtendedComment(const XMLCh* const expression,
+                                       MemoryManager* const manager = 0);
 
 private:
 	// -----------------------------------------------------------------------
diff --git a/src/xercesc/util/regx/Token.hpp b/src/xercesc/util/regx/Token.hpp
index 073f338ea..169b040bf 100644
--- a/src/xercesc/util/regx/Token.hpp
+++ b/src/xercesc/util/regx/Token.hpp
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 2001 The Apache Software Foundation.  All rights
+ * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -64,7 +64,6 @@
 // ---------------------------------------------------------------------------
 //  Includes
 // ---------------------------------------------------------------------------
-#include <xercesc/util/XercesDefs.hpp>
 #include <xercesc/util/RuntimeException.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
@@ -76,7 +75,8 @@ class RangeToken;
 class TokenFactory;
 
 
-class XMLUTIL_EXPORT Token {
+class XMLUTIL_EXPORT Token : public XMemory
+{
 public:
 	// -----------------------------------------------------------------------
     //  Public Constructors and Destructor
diff --git a/src/xercesc/util/regx/TokenFactory.hpp b/src/xercesc/util/regx/TokenFactory.hpp
index 1d53c2430..77818cabb 100644
--- a/src/xercesc/util/regx/TokenFactory.hpp
+++ b/src/xercesc/util/regx/TokenFactory.hpp
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 2001 The Apache Software Foundation.  All rights
+ * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -64,8 +64,6 @@
 // ---------------------------------------------------------------------------
 //  Includes
 // ---------------------------------------------------------------------------
-#include <xercesc/util/XMLUniDefs.hpp>
-#include <xercesc/util/RefHashTableOf.hpp>
 #include <xercesc/util/RefVectorOf.hpp>
 #include <xercesc/util/regx/Token.hpp>
 #include <xercesc/util/Mutexes.hpp>
@@ -85,7 +83,8 @@ class ParenToken;
 class StringToken;
 class UnionToken;
 
-class XMLUTIL_EXPORT TokenFactory {
+class XMLUTIL_EXPORT TokenFactory : public XMemory
+{
 
 public:
 	// -----------------------------------------------------------------------
diff --git a/src/xercesc/validators/DTD/DTDAttDef.cpp b/src/xercesc/validators/DTD/DTDAttDef.cpp
index 65d4ceec8..983bf9beb 100644
--- a/src/xercesc/validators/DTD/DTDAttDef.cpp
+++ b/src/xercesc/validators/DTD/DTDAttDef.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.3  2003/05/15 18:54:50  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.2  2002/11/04 14:50:40  tng
  * C++ Namespace Support.
  *
@@ -104,7 +107,7 @@ DTDAttDef::DTDAttDef(const  XMLCh* const            attName
     , fElemId(XMLElementDecl::fgInvalidElemId)
     , fName(0)
 {
-    fName = XMLString::replicate(attName);
+    fName = XMLString::replicate(attName, getMemoryManager());
 }
 
 DTDAttDef::DTDAttDef(   const   XMLCh* const            attName
@@ -117,12 +120,12 @@ DTDAttDef::DTDAttDef(   const   XMLCh* const            attName
     , fElemId(XMLElementDecl::fgInvalidElemId)
     , fName(0)
 {
-    fName = XMLString::replicate(attName);
+    fName = XMLString::replicate(attName, getMemoryManager());
 }
 
 DTDAttDef::~DTDAttDef()
 {
-    delete [] fName;
+    getMemoryManager()->deallocate(fName); //delete [] fName;
 }
 
 
@@ -131,8 +134,8 @@ DTDAttDef::~DTDAttDef()
 // ---------------------------------------------------------------------------
 void DTDAttDef::setName(const XMLCh* const newName)
 {
-    delete [] fName;
-    fName = XMLString::replicate(newName);
+    getMemoryManager()->deallocate(fName); //delete [] fName;
+    fName = XMLString::replicate(newName, getMemoryManager());
 }
 
 XERCES_CPP_NAMESPACE_END
diff --git a/src/xercesc/validators/DTD/DTDAttDef.hpp b/src/xercesc/validators/DTD/DTDAttDef.hpp
index 0e76f04be..4aa4822eb 100644
--- a/src/xercesc/validators/DTD/DTDAttDef.hpp
+++ b/src/xercesc/validators/DTD/DTDAttDef.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.4  2003/05/15 18:54:50  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2003/01/29 19:46:40  gareth
  * added DOMTypeInfo API
  *
@@ -82,7 +85,6 @@
 #if !defined(DTDATTDEF_HPP)
 #define DTDATTDEF_HPP
 
-#include <xercesc/util/XMLString.hpp>
 #include <xercesc/framework/XMLAttDef.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
diff --git a/src/xercesc/validators/DTD/DTDElementDecl.cpp b/src/xercesc/validators/DTD/DTDElementDecl.cpp
index ca10c250d..1fe9e3851 100644
--- a/src/xercesc/validators/DTD/DTDElementDecl.cpp
+++ b/src/xercesc/validators/DTD/DTDElementDecl.cpp
@@ -78,9 +78,10 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  DTDElementDecl: Constructors and Destructor
 // ---------------------------------------------------------------------------
-DTDElementDecl::DTDElementDecl() :
+DTDElementDecl::DTDElementDecl(MemoryManager* const manager) :
 
-    fAttDefs(0)
+    XMLElementDecl(manager)
+    , fAttDefs(0)
     , fAttList(0)
     , fContentSpec(0)
     , fModelType(Any)
@@ -89,10 +90,12 @@ DTDElementDecl::DTDElementDecl() :
 {
 }
 
-DTDElementDecl::DTDElementDecl( const   XMLCh* const              elemRawName
-                              , const   unsigned int              uriId
-                              , const DTDElementDecl::ModelTypes  type) :
-    fAttDefs(0)
+DTDElementDecl::DTDElementDecl( const XMLCh* const               elemRawName
+                              , const unsigned int               uriId
+                              , const DTDElementDecl::ModelTypes type
+                              , MemoryManager* const             manager) :
+    XMLElementDecl(manager)
+    , fAttDefs(0)
     , fAttList(0)
     , fContentSpec(0)
     , fModelType(type)
@@ -102,9 +105,11 @@ DTDElementDecl::DTDElementDecl( const   XMLCh* const              elemRawName
     setElementName(elemRawName, uriId);
 }
 
-DTDElementDecl::DTDElementDecl( QName* const                elementName
-                              , const DTDElementDecl::ModelTypes  type) :
-    fAttDefs(0)
+DTDElementDecl::DTDElementDecl( QName* const                     elementName
+                              , const DTDElementDecl::ModelTypes type
+                              , MemoryManager* const             manager) :
+    XMLElementDecl(manager)
+    , fAttDefs(0)
     , fAttList(0)
     , fContentSpec(0)
     , fModelType(type)
@@ -120,7 +125,7 @@ DTDElementDecl::~DTDElementDecl()
     delete fAttList;
     delete fContentSpec;
     delete fContentModel;
-    delete [] fFormattedModel;
+    getMemoryManager()->deallocate(fFormattedModel);//delete [] fFormattedModel;
 }
 
 
@@ -149,7 +154,7 @@ XMLAttDef* DTDElementDecl::findAttr(const   XMLCh* const    qName
             faultInAttDefList();
 
         // And add a default attribute for this name
-        retVal = new DTDAttDef(qName);
+        retVal = new (getMemoryManager()) DTDAttDef(qName);
         retVal->setElemId(getId());
         fAttDefs->put((void*)retVal->getFullName(), retVal);
 
@@ -295,17 +300,16 @@ void DTDElementDecl::addAttDef(DTDAttDef* const toAdd)
 // ---------------------------------------------------------------------------
 //  DTDElementDecl: Private helper methods
 // ---------------------------------------------------------------------------
-XMLCh*
-DTDElementDecl::formatContentModel() const
+XMLCh* DTDElementDecl::formatContentModel() const
 {
     XMLCh* newValue = 0;
     if (fModelType == Any)
     {
-        newValue = XMLString::replicate(XMLUni::fgAnyString);
+        newValue = XMLString::replicate(XMLUni::fgAnyString, getMemoryManager());
     }
      else if (fModelType == Empty)
     {
-        newValue = XMLString::replicate(XMLUni::fgEmptyString);
+        newValue = XMLString::replicate(XMLUni::fgEmptyString, getMemoryManager());
     }
      else
     {
@@ -316,7 +320,7 @@ DTDElementDecl::formatContentModel() const
         //
         XMLBuffer bufFmt;
         getContentSpec()->formatSpec(bufFmt);
-        newValue = XMLString::replicate(bufFmt.getRawBuffer());
+        newValue = XMLString::replicate(bufFmt.getRawBuffer(), getMemoryManager());
     }
     return newValue;
 }
@@ -330,7 +334,7 @@ XMLContentModel* DTDElementDecl::makeContentModel()
         //  Just create a mixel content model object. This type of
         //  content model is optimized for mixed content validation.
         //
-        cmRet = new MixedContentModel(true, this->getContentSpec());
+        cmRet = new (getMemoryManager()) MixedContentModel(true, this->getContentSpec());
     }
      else if (fModelType == Children)
     {
@@ -375,7 +379,7 @@ XMLContentModel* DTDElementDecl::createChildModel()
     if (specNode->getType() == ContentSpecNode::Leaf)
     {
         // Create a simple content model
-        return new SimpleContentModel
+        return new (getMemoryManager()) SimpleContentModel
         (
             true
             , specNode->getElement()
@@ -393,7 +397,7 @@ XMLContentModel* DTDElementDecl::createChildModel()
         if ((specNode->getFirst()->getType() == ContentSpecNode::Leaf)
         &&  (specNode->getSecond()->getType() == ContentSpecNode::Leaf))
         {
-            return new SimpleContentModel
+            return new (getMemoryManager()) SimpleContentModel
             (
                 true
                 , specNode->getFirst()->getElement()
@@ -413,7 +417,7 @@ XMLContentModel* DTDElementDecl::createChildModel()
         //
         if (specNode->getFirst()->getType() == ContentSpecNode::Leaf)
         {
-            return new SimpleContentModel
+            return new (getMemoryManager()) SimpleContentModel
             (
                 true
                 , specNode->getFirst()->getElement()
@@ -428,14 +432,19 @@ XMLContentModel* DTDElementDecl::createChildModel()
     }
 
     // Its not any simple type of content, so create a DFA based content model
-    return new DFAContentModel(true, this->getContentSpec());
+    return new (getMemoryManager()) DFAContentModel
+    (
+        true
+        , this->getContentSpec()
+        , getMemoryManager()
+    );
 }
 
 
 void DTDElementDecl::faultInAttDefList() const
 {
     // Use a hash modulus of 29 and tell it owns its elements
-    ((DTDElementDecl*)this)->fAttDefs = new RefHashTableOf<DTDAttDef>(29, true);
+    ((DTDElementDecl*)this)->fAttDefs = new (getMemoryManager()) RefHashTableOf<DTDAttDef>(29, true);
 }
 
 XERCES_CPP_NAMESPACE_END
diff --git a/src/xercesc/validators/DTD/DTDElementDecl.hpp b/src/xercesc/validators/DTD/DTDElementDecl.hpp
index ffe3331e1..cb240c598 100644
--- a/src/xercesc/validators/DTD/DTDElementDecl.hpp
+++ b/src/xercesc/validators/DTD/DTDElementDecl.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.4  2003/05/15 18:54:50  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2003/01/29 19:46:40  gareth
  * added DOMTypeInfo API
  *
@@ -154,19 +157,19 @@ public :
     // -----------------------------------------------------------------------
     //  Constructors and Destructor
     // -----------------------------------------------------------------------
-    DTDElementDecl();
-
+    DTDElementDecl(MemoryManager* const manager);
     DTDElementDecl
     (
-        const XMLCh* const    elemRawName
-      , const unsigned int    uriId
-      , const ModelTypes      modelType = Any
+          const XMLCh* const   elemRawName
+        , const unsigned int   uriId
+        , const ModelTypes     modelType// = Any
+        , MemoryManager* const manager
     );
-
     DTDElementDecl
     (
-        QName* const    elementName
-      , const ModelTypes      modelType = Any
+          QName* const         elementName
+        , const ModelTypes     modelType// = Any
+        , MemoryManager* const manager
     );
 
     ~DTDElementDecl();
diff --git a/src/xercesc/validators/DTD/DTDGrammar.cpp b/src/xercesc/validators/DTD/DTDGrammar.cpp
index 6027f7616..9acacb310 100644
--- a/src/xercesc/validators/DTD/DTDGrammar.cpp
+++ b/src/xercesc/validators/DTD/DTDGrammar.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.5  2003/05/15 18:54:50  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.4  2002/12/04 02:47:25  knoaman
  * scanner re-organization.
  *
@@ -95,8 +98,9 @@ XERCES_CPP_NAMESPACE_BEGIN
 //---------------------------------------------------------------------------
 //  DTDGrammar: Constructors and Destructor
 // ---------------------------------------------------------------------------
-DTDGrammar::DTDGrammar() :
-    fElemDeclPool(0)
+DTDGrammar::DTDGrammar(MemoryManager* const manager) :
+    fMemoryManager(manager)
+    , fElemDeclPool(0)
     , fElemNonDeclPool(0)
     , fEntityDeclPool(0)
     , fNotationDeclPool(0)
@@ -108,10 +112,10 @@ DTDGrammar::DTDGrammar() :
     //  <TBD> Investigate what the optimum values would be for the various
     //  pools.
     //
-    fElemDeclPool = new NameIdPool<DTDElementDecl>(109);
-    fElemNonDeclPool = new NameIdPool<DTDElementDecl>(29);
-    fEntityDeclPool = new NameIdPool<DTDEntityDecl>(109);
-    fNotationDeclPool = new NameIdPool<XMLNotationDecl>(109);
+    fElemDeclPool = new (fMemoryManager) NameIdPool<DTDElementDecl>(109);
+    fElemNonDeclPool = new (fMemoryManager) NameIdPool<DTDElementDecl>(29);
+    fEntityDeclPool = new (fMemoryManager) NameIdPool<DTDEntityDecl>(109);
+    fNotationDeclPool = new (fMemoryManager) NameIdPool<XMLNotationDecl>(109);
 
     //
     //  Call our own reset method. This lets us have the pool setup stuff
@@ -145,7 +149,13 @@ XMLElementDecl* DTDGrammar::findOrAddElemDecl (const   unsigned int    uriId
     // if not, then add this in
     if (!retVal)
     {
-        retVal = new DTDElementDecl(qName, uriId, DTDElementDecl::Any);
+        retVal = new (fMemoryManager) DTDElementDecl
+        (
+            qName
+            , uriId
+            , DTDElementDecl::Any
+            , fMemoryManager
+        );
         const unsigned int elemId = fElemNonDeclPool->put(retVal);
         retVal->setId(elemId);
         wasAdded = true;
@@ -164,7 +174,13 @@ XMLElementDecl* DTDGrammar::putElemDecl (const   unsigned int    uriId
         , unsigned int          scope
         , const bool            notDeclared)
 {
-    DTDElementDecl* retVal = new DTDElementDecl(qName, uriId, DTDElementDecl::Any);
+    DTDElementDecl* retVal = new (fMemoryManager) DTDElementDecl
+    (
+        qName
+        , uriId
+        , DTDElementDecl::Any
+        , fMemoryManager
+    );
     const unsigned int elemId = (notDeclared) ? fElemNonDeclPool->put(retVal)
                                               : fElemDeclPool->put(retVal);
     retVal->setId(elemId);
diff --git a/src/xercesc/validators/DTD/DTDGrammar.hpp b/src/xercesc/validators/DTD/DTDGrammar.hpp
index bb89f4cdb..df5278038 100644
--- a/src/xercesc/validators/DTD/DTDGrammar.hpp
+++ b/src/xercesc/validators/DTD/DTDGrammar.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.6  2003/05/15 18:54:50  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.5  2002/11/04 14:50:40  tng
  * C++ Namespace Support.
  *
@@ -117,7 +120,7 @@ public:
     // -----------------------------------------------------------------------
     //  Constructors and Destructor
     // -----------------------------------------------------------------------
-    DTDGrammar();
+    DTDGrammar(MemoryManager* const manager);
     virtual ~DTDGrammar();
 
 
@@ -268,12 +271,13 @@ private:
     //      or not. When using a cached grammar, no need for pre content
     //      validation.
     // -----------------------------------------------------------------------
-    NameIdPool<DTDElementDecl>*     fElemDeclPool;
-    NameIdPool<DTDElementDecl>*     fElemNonDeclPool;
-    NameIdPool<DTDEntityDecl>*      fEntityDeclPool;
-    NameIdPool<XMLNotationDecl>*    fNotationDeclPool;
-    unsigned int                    fRootElemId;
-    bool                            fValidated;
+    MemoryManager*               fMemoryManager;
+    NameIdPool<DTDElementDecl>*  fElemDeclPool;
+    NameIdPool<DTDElementDecl>*  fElemNonDeclPool;
+    NameIdPool<DTDEntityDecl>*   fEntityDeclPool;
+    NameIdPool<XMLNotationDecl>* fNotationDeclPool;
+    unsigned int                 fRootElemId;
+    bool                         fValidated;
 };
 
 
diff --git a/src/xercesc/validators/DTD/DTDScanner.cpp b/src/xercesc/validators/DTD/DTDScanner.cpp
index 4d6af413d..41d843972 100644
--- a/src/xercesc/validators/DTD/DTDScanner.cpp
+++ b/src/xercesc/validators/DTD/DTDScanner.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.25  2003/05/15 18:54:50  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.24  2003/03/10 15:28:07  tng
  * XML1.0 Errata E38
  *
@@ -247,12 +250,13 @@ XERCES_CPP_NAMESPACE_BEGIN
 //  a repetition suffix. If so, it creates a new correct rep node and wraps
 //  the pass node in it. Otherwise, it returns the previous node.
 //
-static ContentSpecNode*
-makeRepNode(const XMLCh testCh, ContentSpecNode* const prevNode)
+static ContentSpecNode* makeRepNode(const XMLCh testCh,
+                                    ContentSpecNode* const prevNode,
+                                    MemoryManager* const manager)
 {
     if (testCh == chQuestion)
     {
-        return new ContentSpecNode
+        return new (manager) ContentSpecNode
         (
             ContentSpecNode::ZeroOrOne
             , prevNode
@@ -261,7 +265,7 @@ makeRepNode(const XMLCh testCh, ContentSpecNode* const prevNode)
     }
      else if (testCh == chPlus)
     {
-        return new ContentSpecNode
+        return new (manager) ContentSpecNode
         (
             ContentSpecNode::OneOrMore
             , prevNode
@@ -270,7 +274,7 @@ makeRepNode(const XMLCh testCh, ContentSpecNode* const prevNode)
     }
      else if (testCh == chAsterisk)
     {
-        return new ContentSpecNode
+        return new (manager) ContentSpecNode
         (
             ContentSpecNode::ZeroOrMore
             , prevNode
@@ -285,8 +289,11 @@ makeRepNode(const XMLCh testCh, ContentSpecNode* const prevNode)
 // ---------------------------------------------------------------------------
 //  DTDValidator: Constructors and Destructor
 // ---------------------------------------------------------------------------
-DTDScanner::DTDScanner(DTDGrammar* dtdGrammar, DocTypeHandler* const docTypeHandler) :
-    fDocTypeHandler(docTypeHandler)
+DTDScanner::DTDScanner( DTDGrammar*           dtdGrammar
+                      , DocTypeHandler* const docTypeHandler
+                      , MemoryManager* const  manager) :
+    fMemoryManager(manager)
+    , fDocTypeHandler(docTypeHandler)
     , fDumAttDef(0)
     , fDumElemDecl(0)
     , fDumEntityDecl(0)
@@ -605,7 +612,7 @@ DTDScanner::scanAttDef(DTDElementDecl& parentElem, XMLBuffer& bufToUse)
         // Use the dummy decl to parse into and set its name to the name we got
         if (!fDumAttDef)
         {
-            fDumAttDef = new DTDAttDef;
+            fDumAttDef = new (fMemoryManager) DTDAttDef;
             fDumAttDef->setId(fNextAttrId++);
         }
         fDumAttDef->setName(bufToUse.getRawBuffer());
@@ -617,7 +624,7 @@ DTDScanner::scanAttDef(DTDElementDecl& parentElem, XMLBuffer& bufToUse)
         //  It does not already exist so create a new one, give it the next
         //  available unique id, and add it
         //
-        decl = new DTDAttDef(bufToUse.getRawBuffer());
+        decl = new (fMemoryManager) DTDAttDef(bufToUse.getRawBuffer());
         decl->setId(fNextAttrId++);
         decl->setExternalAttDeclaration(isReadingExternalEntity());
         parentElem.addAttDef(decl);
@@ -794,7 +801,13 @@ void DTDScanner::scanAttListDecl()
         //  it having been created because of an attlist. Later, if its
         //  declared, this will be updated.
         //
-        elemDecl = new DTDElementDecl(bbName.getRawBuffer(), fEmptyNamespaceId);
+        elemDecl = new (fMemoryManager) DTDElementDecl
+        (
+            bbName.getRawBuffer()
+            , fEmptyNamespaceId
+            , DTDElementDecl::Any
+            , fMemoryManager
+        );
         elemDecl->setCreateReason(XMLElementDecl::AttList);
         elemDecl->setExternalElemDeclaration(isReadingExternalEntity());
         fDTDGrammar->putElemDecl((XMLElementDecl*) elemDecl);
@@ -1247,19 +1260,25 @@ DTDScanner::scanChildren(const DTDElementDecl& elemDecl, XMLBuffer& bufToUse)
         XMLElementDecl* decl = fDTDGrammar->getElemDecl(fEmptyNamespaceId, 0, bufToUse.getRawBuffer(), Grammar::TOP_LEVEL_SCOPE);
         if (!decl)
         {
-            decl = new DTDElementDecl(bufToUse.getRawBuffer(), fEmptyNamespaceId);
+            decl = new (fMemoryManager) DTDElementDecl
+            (
+                bufToUse.getRawBuffer()
+                , fEmptyNamespaceId
+                , DTDElementDecl::Any
+                , fMemoryManager
+            );
             decl->setCreateReason(XMLElementDecl::InContentModel);
             decl->setExternalElemDeclaration(isReadingExternalEntity());
             fDTDGrammar->putElemDecl(decl);
         }
-        curNode = new ContentSpecNode(decl->getElementName());
+        curNode = new (fMemoryManager) ContentSpecNode(decl->getElementName());
 
         // Check for a PE ref here, but don't require spaces
         const bool gotSpaces = checkForPERef(false, false, true);
 
         // Check for a repetition character after the leaf
         const XMLCh repCh = fReaderMgr->peekNextChar();
-        ContentSpecNode* tmpNode = makeRepNode(repCh, curNode);
+        ContentSpecNode* tmpNode = makeRepNode(repCh, curNode, fMemoryManager);
         if (tmpNode != curNode)
         {
             if (gotSpaces)
@@ -1301,13 +1320,13 @@ DTDScanner::scanChildren(const DTDElementDecl& elemDecl, XMLBuffer& bufToUse)
     if (opCh == chComma)
     {
         curType = ContentSpecNode::Sequence;
-        headNode = new ContentSpecNode(curType, curNode, 0);
+        headNode = new (fMemoryManager) ContentSpecNode(curType, curNode, 0);
         curNode = headNode;
     }
      else if (opCh == chPipe)
     {
         curType = ContentSpecNode::Choice;
-        headNode = new ContentSpecNode(curType, curNode, 0);
+        headNode = new (fMemoryManager) ContentSpecNode(curType, curNode, 0);
         curNode = headNode;
     }
      else
@@ -1417,17 +1436,23 @@ DTDScanner::scanChildren(const DTDElementDecl& elemDecl, XMLBuffer& bufToUse)
                     XMLElementDecl* decl = fDTDGrammar->getElemDecl(fEmptyNamespaceId, 0, bufToUse.getRawBuffer(), Grammar::TOP_LEVEL_SCOPE);
                     if (!decl)
                     {
-                        decl = new DTDElementDecl(bufToUse.getRawBuffer(), fEmptyNamespaceId);
+                        decl = new (fMemoryManager) DTDElementDecl
+                        (
+                            bufToUse.getRawBuffer()
+                            , fEmptyNamespaceId
+                            , DTDElementDecl::Any
+                            , fMemoryManager
+                        );
                         decl->setCreateReason(XMLElementDecl::InContentModel);
                         decl->setExternalElemDeclaration(isReadingExternalEntity());
                         fDTDGrammar->putElemDecl(decl);
                     }
 
-                    ContentSpecNode* tmpLeaf = new ContentSpecNode(decl->getElementName());
+                    ContentSpecNode* tmpLeaf = new (fMemoryManager) ContentSpecNode(decl->getElementName());
 
                     // Check for a repetition character after the leaf
                     const XMLCh repCh = fReaderMgr->peekNextChar();
-                    ContentSpecNode* tmpLeaf2 = makeRepNode(repCh, tmpLeaf);
+                    ContentSpecNode* tmpLeaf2 = makeRepNode(repCh, tmpLeaf, fMemoryManager);
                     if (tmpLeaf != tmpLeaf2)
                         fReaderMgr->getNextChar();
 
@@ -1437,7 +1462,7 @@ DTDScanner::scanChildren(const DTDElementDecl& elemDecl, XMLBuffer& bufToUse)
                     //  Make the new node the second node of the current node,
                     //  and then make it the current node.
                     //
-                    ContentSpecNode* newCur = new ContentSpecNode
+                    ContentSpecNode* newCur = new (fMemoryManager) ContentSpecNode
                     (
                         curType
                         , tmpLeaf2
@@ -1475,7 +1500,7 @@ DTDScanner::scanChildren(const DTDElementDecl& elemDecl, XMLBuffer& bufToUse)
     //  of it.
     //
     XMLCh repCh = fReaderMgr->peekNextChar();
-    ContentSpecNode* retNode = makeRepNode(repCh, headNode);
+    ContentSpecNode* retNode = makeRepNode(repCh, headNode, fMemoryManager);
     if (retNode != headNode)
         fReaderMgr->getNextChar();
 
@@ -1767,7 +1792,13 @@ void DTDScanner::scanElementDecl()
                 fScanner->getValidator()->emitError(XMLValid::ElementAlreadyExists, bbName.getRawBuffer());
 
             if (!fDumElemDecl)
-                fDumElemDecl = new DTDElementDecl(bbName.getRawBuffer(), fEmptyNamespaceId);
+                fDumElemDecl = new (fMemoryManager) DTDElementDecl
+                (
+                    bbName.getRawBuffer()
+                    , fEmptyNamespaceId
+                    , DTDElementDecl::Any
+                    , fMemoryManager
+                );
             else
                 fDumElemDecl->setElementName(bbName.getRawBuffer(),fEmptyNamespaceId);
         }
@@ -1778,7 +1809,13 @@ void DTDScanner::scanElementDecl()
         //  Create the new empty declaration to fill in and put it into
         //  the decl pool.
         //
-        decl = new DTDElementDecl(bbName.getRawBuffer(), fEmptyNamespaceId);
+        decl = new (fMemoryManager) DTDElementDecl
+        (
+            bbName.getRawBuffer()
+            , fEmptyNamespaceId
+            , DTDElementDecl::Any
+            , fMemoryManager
+        );
         fDTDGrammar->putElemDecl(decl);
     }
 
@@ -1887,14 +1924,14 @@ void DTDScanner::scanEntityDecl()
     if (entityDecl)
     {
         if (!fDumEntityDecl)
-            fDumEntityDecl = new DTDEntityDecl;
+            fDumEntityDecl = new (fMemoryManager) DTDEntityDecl;
         fDumEntityDecl->setName(bbName.getRawBuffer());
         entityDecl = fDumEntityDecl;
     }
      else
     {
         // Its not in existence already, then create an entity decl for it
-        entityDecl = new DTDEntityDecl(bbName.getRawBuffer());
+        entityDecl = new (fMemoryManager) DTDEntityDecl(bbName.getRawBuffer());
 
         //
         //  Set the declaration location. The parameter indicates whether its
@@ -3269,7 +3306,7 @@ bool DTDScanner::scanMixed(DTDElementDecl& toFill)
     //  tree as we go.
     //
     ContentSpecNode* curNode =
-                 new ContentSpecNode(new QName(XMLUni::fgZeroLenString,
+                 new (fMemoryManager) ContentSpecNode(new (fMemoryManager) QName(XMLUni::fgZeroLenString,
                                                XMLUni::fgZeroLenString,
                                                XMLElementDecl::fgPCDataElemId),
                                      false);
@@ -3339,7 +3376,7 @@ bool DTDScanner::scanMixed(DTDElementDecl& toFill)
                 //  node its first child.
                 //
                 if (starRequired || starSkipped) {
-                    headNode = new ContentSpecNode
+                    headNode = new (fMemoryManager) ContentSpecNode
                     (
                         ContentSpecNode::ZeroOrMore
                         , headNode
@@ -3374,7 +3411,13 @@ bool DTDScanner::scanMixed(DTDElementDecl& toFill)
             XMLElementDecl* decl = fDTDGrammar->getElemDecl(fEmptyNamespaceId, 0, nameBuf.getRawBuffer(), Grammar::TOP_LEVEL_SCOPE);
             if (!decl)
             {
-                decl = new DTDElementDecl(nameBuf.getRawBuffer(), fEmptyNamespaceId);
+                decl = new (fMemoryManager) DTDElementDecl
+                (
+                    nameBuf.getRawBuffer()
+                    , fEmptyNamespaceId
+                    , DTDElementDecl::Any
+                    , fMemoryManager
+                );
                 decl->setCreateReason(XMLElementDecl::InContentModel);
                 decl->setExternalElemDeclaration(isReadingExternalEntity());
                 fDTDGrammar->putElemDecl(decl);
@@ -3391,11 +3434,11 @@ bool DTDScanner::scanMixed(DTDElementDecl& toFill)
             //
             if (curNode == orgNode)
             {
-                curNode = new ContentSpecNode
+                curNode = new (fMemoryManager) ContentSpecNode
                 (
                     ContentSpecNode::Choice
                     , curNode
-                    , new ContentSpecNode(decl->getElementName())
+                    , new (fMemoryManager) ContentSpecNode(decl->getElementName())
                 );
 
                 // Remember the top node
@@ -3406,11 +3449,11 @@ bool DTDScanner::scanMixed(DTDElementDecl& toFill)
                 ContentSpecNode* oldRight = curNode->orphanSecond();
                 curNode->setSecond
                 (
-                    new ContentSpecNode
+                    new (fMemoryManager) ContentSpecNode
                     (
                         ContentSpecNode::Choice
                         , oldRight
-                        , new ContentSpecNode(decl->getElementName())
+                        , new (fMemoryManager) ContentSpecNode(decl->getElementName())
                     )
                 );
 
@@ -3500,7 +3543,7 @@ void DTDScanner::scanNotationDecl()
         ReaderMgr::LastExtEntityInfo lastInfo;
         fReaderMgr->getLastExtEntityInfo(lastInfo);
 
-        decl = new XMLNotationDecl
+        decl = new (fMemoryManager) XMLNotationDecl
         (
             bbName.getRawBuffer()
             , (publicId && *publicId) ? publicId : 0
diff --git a/src/xercesc/validators/DTD/DTDScanner.hpp b/src/xercesc/validators/DTD/DTDScanner.hpp
index d05a371a4..1f15b87cb 100644
--- a/src/xercesc/validators/DTD/DTDScanner.hpp
+++ b/src/xercesc/validators/DTD/DTDScanner.hpp
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 1999-2001 The Apache Software Foundation.  All rights
+ * Copyright (c) 1999-2003 The Apache Software Foundation.  All rights
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.7  2003/05/15 18:54:51  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.6  2003/02/05 22:07:09  tng
  * [Bug 3111] Problem with LexicalHandler::startDTD() and LexicalHandler::endDTD().
  *
@@ -105,7 +108,7 @@ class XMLScanner;
  */
 class DocTypeHandler;
 
-class VALIDATORS_EXPORT DTDScanner
+class VALIDATORS_EXPORT DTDScanner : public XMemory
 {
 public:
     // -----------------------------------------------------------------------
@@ -137,7 +140,12 @@ public:
     // -----------------------------------------------------------------------
     //  Constructors and Destructor
     // -----------------------------------------------------------------------
-    DTDScanner(DTDGrammar* dtdGrammar, DocTypeHandler* const docTypeHandler);
+    DTDScanner
+    (
+          DTDGrammar*           dtdGrammar
+        , DocTypeHandler* const docTypeHandler
+        , MemoryManager* const  manager
+    );
     virtual ~DTDScanner();
 
     // -----------------------------------------------------------------------
@@ -286,6 +294,7 @@ private:
     //      current reader to decide whether we are processing an external/internal
     //      declaration
     // -----------------------------------------------------------------------
+    MemoryManager*                  fMemoryManager;
     DocTypeHandler*                 fDocTypeHandler;
     DTDAttDef*                      fDumAttDef;
     DTDElementDecl*                 fDumElemDecl;
diff --git a/src/xercesc/validators/common/AllContentModel.cpp b/src/xercesc/validators/common/AllContentModel.cpp
index 33b2ad844..047717430 100644
--- a/src/xercesc/validators/common/AllContentModel.cpp
+++ b/src/xercesc/validators/common/AllContentModel.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.4  2003/05/15 18:48:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/11/04 14:54:58  tng
  * C++ Namespace Support.
  *
@@ -93,9 +96,11 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  AllContentModel: Constructors and Destructor
 // ---------------------------------------------------------------------------
-AllContentModel::AllContentModel(ContentSpecNode* const parentContentSpec
-                               , const bool             isMixed) :
-   fCount(0)
+AllContentModel::AllContentModel( ContentSpecNode* const parentContentSpec
+                                , const bool             isMixed
+                                , MemoryManager* const   manager) :
+   fMemoryManager(manager)
+ , fCount(0)
  , fChildren(0)
  , fChildOptional(0)
  , fNumRequired(0)
@@ -128,8 +133,8 @@ AllContentModel::AllContentModel(ContentSpecNode* const parentContentSpec
     //  fill them in.
     //
     fCount = children.size();
-    fChildren = new QName*[fCount];
-    fChildOptional = new bool[fCount];
+    fChildren = (QName**) fMemoryManager->allocate(fCount * sizeof(QName*)); //new QName*[fCount];
+    fChildOptional = (bool*) fMemoryManager->allocate(fCount * sizeof(bool)); //new bool[fCount];
     for (unsigned int index = 0; index < fCount; index++) {
         fChildren[index] = children.elementAt(index);
         fChildOptional[index] = childOptional.elementAt(index);
@@ -138,8 +143,8 @@ AllContentModel::AllContentModel(ContentSpecNode* const parentContentSpec
 
 AllContentModel::~AllContentModel()
 {
-    delete [] fChildren;
-    delete [] fChildOptional;
+    fMemoryManager->deallocate(fChildren); //delete [] fChildren;
+    fMemoryManager->deallocate(fChildOptional); //delete [] fChildOptional;
 }
 
 // ---------------------------------------------------------------------------
@@ -162,7 +167,7 @@ AllContentModel::validateContent( QName** const         children
         return -1;
 
     // Check for duplicate element
-    bool* elementSeen = new bool[fCount];
+    bool* elementSeen = (bool*) fMemoryManager->allocate(fCount*sizeof(bool)); //new bool[fCount];
 
     // initialize the array
     for (unsigned int i = 0; i < fCount; i++)
@@ -190,7 +195,7 @@ AllContentModel::validateContent( QName** const         children
                 // If this element was seen already, indicate an error was
                 // found at the duplicate index.
                 if (elementSeen[inIndex]) {
-                    delete [] elementSeen;
+                    fMemoryManager->deallocate(elementSeen); //delete [] elementSeen;
                     return outIndex;
                 }
                 else
@@ -205,13 +210,13 @@ AllContentModel::validateContent( QName** const         children
 
         // We did not find this one, so the validation failed
         if (inIndex == fCount) {
-            delete [] elementSeen;
+            fMemoryManager->deallocate(elementSeen); //delete [] elementSeen;
             return outIndex;
         }
 
     }
 
-    delete [] elementSeen;
+    fMemoryManager->deallocate(elementSeen); //delete [] elementSeen;
 
     // Were all the required elements of the <all> encountered?
     if (numRequiredSeen != fNumRequired) {
@@ -239,7 +244,7 @@ int AllContentModel::validateContentSpecial(QName** const           children
         return -1;
 
     // Check for duplicate element
-    bool* elementSeen = new bool[fCount];
+    bool* elementSeen = (bool*) fMemoryManager->allocate(fCount*sizeof(bool)); //new bool[fCount];
 
     // initialize the array
     for (unsigned int i = 0; i < fCount; i++)
@@ -266,7 +271,7 @@ int AllContentModel::validateContentSpecial(QName** const           children
                 // If this element was seen already, indicate an error was
                 // found at the duplicate index.
                 if (elementSeen[inIndex]) {
-                    delete [] elementSeen;
+                    fMemoryManager->deallocate(elementSeen); //delete [] elementSeen;
                     return outIndex;
                 }
                 else
@@ -281,13 +286,13 @@ int AllContentModel::validateContentSpecial(QName** const           children
 
         // We did not find this one, so the validation failed
         if (inIndex == fCount) {
-            delete [] elementSeen;
+            fMemoryManager->deallocate(elementSeen); //delete [] elementSeen;
             return outIndex;
         }
 
     }
 
-    delete [] elementSeen;
+    fMemoryManager->deallocate(elementSeen); //delete [] elementSeen;
 
     // Were all the required elements of the <all> encountered?
     if (numRequiredSeen != fNumRequired) {
diff --git a/src/xercesc/validators/common/AllContentModel.hpp b/src/xercesc/validators/common/AllContentModel.hpp
index 337614ba0..0730bd379 100644
--- a/src/xercesc/validators/common/AllContentModel.hpp
+++ b/src/xercesc/validators/common/AllContentModel.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.4  2003/05/15 18:48:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2003/03/07 18:16:57  tng
  * Return a reference instead of void for operator=
  *
@@ -77,8 +80,8 @@
 #if !defined(ALLCONTENTMODEL_HPP)
 #define ALLCONTENTMODEL_HPP
 
-#include <xercesc/util/ValueVectorOf.hpp>
 #include <xercesc/framework/XMLContentModel.hpp>
+#include <xercesc/util/ValueVectorOf.hpp>
 #include <xercesc/validators/common/ContentLeafNameTypeVector.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
@@ -102,8 +105,9 @@ public :
     // -----------------------------------------------------------------------
     AllContentModel
     (
-      ContentSpecNode* const  parentContentSpec
-		, const bool            isMixed
+          ContentSpecNode* const parentContentSpec
+		, const bool             isMixed
+        , MemoryManager* const   manager
     );
 
     ~AllContentModel();
@@ -180,6 +184,7 @@ private :
     //  fIsMixed
     //      AllContentModel with mixed PCDATA.
     // -----------------------------------------------------------------------
+    MemoryManager* fMemoryManager;
     unsigned int    fCount;
     QName**         fChildren;
     bool*           fChildOptional;
diff --git a/src/xercesc/validators/common/CMAny.cpp b/src/xercesc/validators/common/CMAny.cpp
index 3224ed4b5..4dcea5d99 100644
--- a/src/xercesc/validators/common/CMAny.cpp
+++ b/src/xercesc/validators/common/CMAny.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.3  2003/05/15 18:48:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.2  2002/11/04 14:54:58  tng
  * C++ Namespace Support.
  *
@@ -95,10 +98,11 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  CMUnaryOp: Constructors and Destructor
 // ---------------------------------------------------------------------------
-CMAny::CMAny( const   ContentSpecNode::NodeTypes  type
-                     , const unsigned int         URI
-                     , const unsigned int         position ) :
-       CMNode(type)
+CMAny::CMAny( const ContentSpecNode::NodeTypes type
+            , const unsigned int               URI
+            , const unsigned int               position
+            ,       MemoryManager* const       manager) :
+       CMNode(type, manager)
      , fURI(URI)
      , fPosition(position)
 {
diff --git a/src/xercesc/validators/common/CMAny.hpp b/src/xercesc/validators/common/CMAny.hpp
index 44bdb6899..d61bad720 100644
--- a/src/xercesc/validators/common/CMAny.hpp
+++ b/src/xercesc/validators/common/CMAny.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.3  2003/05/15 18:48:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.2  2002/11/04 14:54:58  tng
  * C++ Namespace Support.
  *
@@ -73,7 +76,6 @@
 #if !defined(CMANY_HPP)
 #define CMANY_HPP
 
-#include <xercesc/util/XercesDefs.hpp>
 #include <xercesc/validators/common/CMNode.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
@@ -88,9 +90,10 @@ public :
     // -----------------------------------------------------------------------
     CMAny
     (
-        const   ContentSpecNode::NodeTypes  type
-        , const unsigned int                URI
-        , const unsigned int                position
+        const   ContentSpecNode::NodeTypes type
+        , const unsigned int               URI
+        , const unsigned int               position
+        ,       MemoryManager* const       manager
     );
     ~CMAny();
 
diff --git a/src/xercesc/validators/common/CMBinaryOp.cpp b/src/xercesc/validators/common/CMBinaryOp.cpp
index 3f9e5ff42..1b362a574 100644
--- a/src/xercesc/validators/common/CMBinaryOp.cpp
+++ b/src/xercesc/validators/common/CMBinaryOp.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.3  2003/05/15 18:48:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.2  2002/11/04 14:54:58  tng
  * C++ Namespace Support.
  *
@@ -104,10 +107,11 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  CMBinaryOp: Constructors
 // ---------------------------------------------------------------------------
-CMBinaryOp::CMBinaryOp( const   ContentSpecNode::NodeTypes  type
-                        ,       CMNode* const               leftToAdopt
-                        ,       CMNode* const               rightToAdopt) :
-    CMNode(type)
+CMBinaryOp::CMBinaryOp( const ContentSpecNode::NodeTypes type
+                        ,     CMNode* const              leftToAdopt
+                        ,     CMNode* const              rightToAdopt
+                        ,     MemoryManager* const       manager) :
+    CMNode(type, manager)
     , fLeftChild(leftToAdopt)
     , fRightChild(rightToAdopt)
 {
diff --git a/src/xercesc/validators/common/CMBinaryOp.hpp b/src/xercesc/validators/common/CMBinaryOp.hpp
index 72fd139b3..1eff593ea 100644
--- a/src/xercesc/validators/common/CMBinaryOp.hpp
+++ b/src/xercesc/validators/common/CMBinaryOp.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.3  2003/05/15 18:48:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.2  2002/11/04 14:54:58  tng
  * C++ Namespace Support.
  *
@@ -95,7 +98,6 @@
 #if !defined(CMBINARYOP_HPP)
 #define CMBINARYOP_HPP
 
-#include <xercesc/util/XercesDefs.hpp>
 #include <xercesc/validators/common/CMNode.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
@@ -110,9 +112,10 @@ public :
     // -----------------------------------------------------------------------
     CMBinaryOp
     (
-        const   ContentSpecNode::NodeTypes  type
-        ,       CMNode* const               leftToAdopt
-        ,       CMNode* const               rightToAdopt
+        const ContentSpecNode::NodeTypes type
+        ,     CMNode* const              leftToAdopt
+        ,     CMNode* const              rightToAdopt
+        ,     MemoryManager* const       manager
     );
     ~CMBinaryOp();
 
diff --git a/src/xercesc/validators/common/CMLeaf.hpp b/src/xercesc/validators/common/CMLeaf.hpp
index b334d6b96..061323db9 100644
--- a/src/xercesc/validators/common/CMLeaf.hpp
+++ b/src/xercesc/validators/common/CMLeaf.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.3  2003/05/15 18:48:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.2  2002/11/04 14:54:58  tng
  * C++ Namespace Support.
  *
@@ -114,11 +117,8 @@
 #if !defined(CMLEAF_HPP)
 #define CMLEAF_HPP
 
-#include <xercesc/util/XercesDefs.hpp>
-#include <xercesc/util/RuntimeException.hpp>
-#include <xercesc/validators/common/ContentSpecNode.hpp>
 #include <xercesc/validators/common/CMNode.hpp>
-#include <xercesc/validators/common/CMStateSet.hpp>
+
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -135,14 +135,16 @@ public :
     // -----------------------------------------------------------------------
     CMLeaf
     (
-          QName* const          element
-        , const unsigned int    position = ~0
+          QName* const         element
+        , const unsigned int   position = ~0
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
     );
     CMLeaf
     (
-          QName* const          element
-        , const unsigned int    position
-        , const bool            adopt
+          QName* const         element
+        , const unsigned int   position
+        , const bool           adopt
+        , MemoryManager* const manager
     );
     ~CMLeaf();
 
@@ -199,18 +201,22 @@ private :
 // -----------------------------------------------------------------------
 //  Constructors
 // -----------------------------------------------------------------------
-inline CMLeaf::CMLeaf(    QName* const          element
-                        , const unsigned int    position) :
-    CMNode(ContentSpecNode::Leaf)
+inline CMLeaf::CMLeaf(       QName* const         element
+                     , const unsigned int         position
+                     ,       MemoryManager* const manager) :
+    CMNode(ContentSpecNode::Leaf, manager)
     , fElement(0)
     , fPosition(position)
     , fAdopt(false)
 {
     if (!element)
     {
-        fElement = new QName(XMLUni::fgZeroLenString
-                           , XMLUni::fgZeroLenString
-                           , XMLElementDecl::fgInvalidElemId);
+        fElement = new (fMemoryManager) QName
+        (
+              XMLUni::fgZeroLenString
+            , XMLUni::fgZeroLenString
+            , XMLElementDecl::fgInvalidElemId
+        );
         // We have to be responsible for this QName - override default fAdopt
         fAdopt = true;
     }
@@ -220,19 +226,23 @@ inline CMLeaf::CMLeaf(    QName* const          element
     }
 }
 
-inline CMLeaf::CMLeaf(    QName* const          element
-                        , const unsigned int    position
-                        , const bool            adopt) :
-    CMNode(ContentSpecNode::Leaf)
+inline CMLeaf::CMLeaf(       QName* const         element
+                     , const unsigned int         position
+                     , const bool                 adopt
+                     ,       MemoryManager* const manager) :
+    CMNode(ContentSpecNode::Leaf, manager)
     , fElement(0)
     , fPosition(position)
     , fAdopt(adopt)
 {
     if (!element)
     {
-        fElement = new QName(XMLUni::fgZeroLenString
-                           , XMLUni::fgZeroLenString
-                           , XMLElementDecl::fgInvalidElemId);
+        fElement = new (fMemoryManager) QName
+        (
+              XMLUni::fgZeroLenString
+            , XMLUni::fgZeroLenString
+            , XMLElementDecl::fgInvalidElemId
+        );
         // We have to be responsible for this QName - override adopt parameter
         fAdopt = true;
     }
diff --git a/src/xercesc/validators/common/CMNode.hpp b/src/xercesc/validators/common/CMNode.hpp
index a643da653..2d5d656e0 100644
--- a/src/xercesc/validators/common/CMNode.hpp
+++ b/src/xercesc/validators/common/CMNode.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.4  2003/05/15 18:48:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2003/03/07 18:16:57  tng
  * Return a reference instead of void for operator=
  *
@@ -102,19 +105,22 @@
 #if !defined(CMNODE_HPP)
 #define CMNODE_HPP
 
-#include <xercesc/util/XercesDefs.hpp>
 #include <xercesc/validators/common/ContentSpecNode.hpp>
 #include <xercesc/validators/common/CMStateSet.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
-class CMNode
+class CMNode : public XMemory
 {
 public :
     // -----------------------------------------------------------------------
     //  Constructors and Destructors
     // -----------------------------------------------------------------------
-    CMNode(const ContentSpecNode::NodeTypes type);
+    CMNode
+    (
+        const ContentSpecNode::NodeTypes type
+        , MemoryManager* const manager
+    );
     virtual ~CMNode();
 
 
@@ -145,6 +151,14 @@ protected :
     virtual void calcFirstPos(CMStateSet& toUpdate) const = 0;
     virtual void calcLastPos(CMStateSet& toUpdate) const = 0;
 
+    // -----------------------------------------------------------------------
+    //  Protected data members
+    //
+    //  fMemoryManager
+    //      Pluggable memory manager for dynamic allocation/deallocation.
+    // -----------------------------------------------------------------------
+    MemoryManager*             fMemoryManager;
+
 
 private :
     // -----------------------------------------------------------------------
@@ -177,10 +191,10 @@ private :
     //      has to be stored redundantly, but we need to fault in the
     //      state set members and they have to be sized to this size.
     // -----------------------------------------------------------------------
-    ContentSpecNode::NodeTypes  fType;
-    CMStateSet*                 fFirstPos;
-    CMStateSet*                 fLastPos;
-    unsigned int                fMaxStates;
+    ContentSpecNode::NodeTypes fType;
+    CMStateSet*                fFirstPos;
+    CMStateSet*                fLastPos;
+    unsigned int               fMaxStates;
 };
 
 
@@ -188,9 +202,11 @@ private :
 // ---------------------------------------------------------------------------
 //  CMNode: Constructors and Destructors
 // ---------------------------------------------------------------------------
-inline CMNode::CMNode(const ContentSpecNode::NodeTypes type) :
+inline CMNode::CMNode(const ContentSpecNode::NodeTypes type,
+                      MemoryManager* const manager) :
 
-    fType(type)
+    fMemoryManager(manager)
+    , fType(type)
     , fFirstPos(0)
     , fLastPos(0)
     , fMaxStates(~0)
@@ -222,7 +238,7 @@ inline const CMStateSet& CMNode::getFirstPos() const
     if (!fFirstPos)
     {
         CMNode* unconstThis = (CMNode*)this;
-        unconstThis->fFirstPos = new CMStateSet(fMaxStates);
+        unconstThis->fFirstPos = new (fMemoryManager) CMStateSet(fMaxStates, fMemoryManager);
         unconstThis->calcFirstPos(*fFirstPos);
     }
     return *fFirstPos;
@@ -237,7 +253,7 @@ inline const CMStateSet& CMNode::getLastPos() const
     if (!fLastPos)
     {
         CMNode* unconstThis = (CMNode*)this;
-        unconstThis->fLastPos = new CMStateSet(fMaxStates);
+        unconstThis->fLastPos = new (fMemoryManager) CMStateSet(fMaxStates, fMemoryManager);
         unconstThis->calcLastPos(*fLastPos);
     }
     return *fLastPos;
diff --git a/src/xercesc/validators/common/CMStateSet.hpp b/src/xercesc/validators/common/CMStateSet.hpp
index 76e14c6de..51aaf5901 100644
--- a/src/xercesc/validators/common/CMStateSet.hpp
+++ b/src/xercesc/validators/common/CMStateSet.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.4  2003/05/15 18:48:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/11/04 14:54:58  tng
  * C++ Namespace Support.
  *
@@ -112,23 +115,25 @@
 #if !defined(CMSTATESET_HPP)
 #define CMSTATESET_HPP
 
-#include <xercesc/util/XercesDefs.hpp>
 #include <xercesc/util/ArrayIndexOutOfBoundsException.hpp>
-#include <xercesc/framework/XMLValidityCodes.hpp>
+#include <xercesc/util/RuntimeException.hpp>
+#include <xercesc/framework/MemoryManager.hpp>
 #include <string.h>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
-class CMStateSet
+class CMStateSet : public XMemory
 {
 public :
     // -----------------------------------------------------------------------
     //  Constructors and Destructor
     // -----------------------------------------------------------------------
-    CMStateSet(const unsigned int bitCount) :
+    CMStateSet( const unsigned int bitCount
+              , MemoryManager* const manager) :
 
         fBitCount(bitCount)
         , fByteArray(0)
+        , fMemoryManager(manager)
     {
         //
         //  See if we need to allocate the byte array or whether we can live
@@ -139,7 +144,7 @@ public :
             fByteCount = fBitCount / 8;
             if (fBitCount % 8)
                 fByteCount++;
-            fByteArray = new XMLByte[fByteCount];
+            fByteArray = (XMLByte*) fMemoryManager->allocate(fByteCount*sizeof(XMLByte)); //new XMLByte[fByteCount];
         }
 
         // Init all the bits to zero
@@ -157,6 +162,7 @@ public :
     CMStateSet(const CMStateSet& toCopy) :
         fBitCount(toCopy.fBitCount)
       , fByteArray(0)
+      , fMemoryManager(toCopy.fMemoryManager)
     {
         //
         //  See if we need to allocate the byte array or whether we can live
@@ -167,7 +173,7 @@ public :
             fByteCount = fBitCount / 8;
             if (fBitCount % 8)
                 fByteCount++;
-            fByteArray = new XMLByte[fByteCount];
+            fByteArray = (XMLByte*) fMemoryManager->allocate(fByteCount*sizeof(XMLByte)); //new XMLByte[fByteCount];
 
             memcpy((void *) fByteArray,
                    (const void *) toCopy.fByteArray,
@@ -186,7 +192,7 @@ public :
     ~CMStateSet()
     {
         if (fByteArray)
-            delete [] fByteArray;
+            fMemoryManager->deallocate(fByteArray); //delete [] fByteArray;
     }
 
 
@@ -392,6 +398,7 @@ private :
     unsigned int    fBits1;
     unsigned int    fBits2;
     XMLByte*        fByteArray;
+    MemoryManager*  fMemoryManager;
 };
 
 XERCES_CPP_NAMESPACE_END
diff --git a/src/xercesc/validators/common/CMUnaryOp.cpp b/src/xercesc/validators/common/CMUnaryOp.cpp
index 55ccfa2ad..6e15649df 100644
--- a/src/xercesc/validators/common/CMUnaryOp.cpp
+++ b/src/xercesc/validators/common/CMUnaryOp.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.3  2003/05/15 18:48:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.2  2002/11/04 14:54:58  tng
  * C++ Namespace Support.
  *
@@ -96,7 +99,6 @@
 // ---------------------------------------------------------------------------
 //  Includes
 // ---------------------------------------------------------------------------
-#include <xercesc/util/XercesDefs.hpp>
 #include <xercesc/util/RuntimeException.hpp>
 #include <xercesc/validators/common/CMStateSet.hpp>
 #include <xercesc/validators/common/CMUnaryOp.hpp>
@@ -106,9 +108,10 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  CMUnaryOp: Constructors and Destructor
 // ---------------------------------------------------------------------------
-CMUnaryOp::CMUnaryOp(   const   ContentSpecNode::NodeTypes  type
-                        ,       CMNode* const               nodeToAdopt) :
-    CMNode(type)
+CMUnaryOp::CMUnaryOp( const ContentSpecNode::NodeTypes type
+                    ,       CMNode* const              nodeToAdopt
+                    ,       MemoryManager* const       manager) :
+    CMNode(type, manager)
     , fChild(nodeToAdopt)
 {
     // Insure that its one of the types we require
diff --git a/src/xercesc/validators/common/CMUnaryOp.hpp b/src/xercesc/validators/common/CMUnaryOp.hpp
index ca7b0b12e..b7bf2e832 100644
--- a/src/xercesc/validators/common/CMUnaryOp.hpp
+++ b/src/xercesc/validators/common/CMUnaryOp.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.3  2003/05/15 18:48:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.2  2002/11/04 14:54:58  tng
  * C++ Namespace Support.
  *
@@ -96,9 +99,8 @@
 #if !defined(CMUNARYOP_HPP)
 #define CMUNARYOP_HPP
 
-#include <xercesc/util/XercesDefs.hpp>
 #include <xercesc/validators/common/CMNode.hpp>
-#include <xercesc/validators/common/ContentSpecNode.hpp>
+
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -112,8 +114,9 @@ public :
     // -----------------------------------------------------------------------
     CMUnaryOp
     (
-        const   ContentSpecNode::NodeTypes  type
-        ,       CMNode* const               nodeToAdopt
+          const ContentSpecNode::NodeTypes type
+        ,       CMNode* const              nodeToAdopt
+        ,       MemoryManager* const       manager
     );
     ~CMUnaryOp();
 
diff --git a/src/xercesc/validators/common/ContentLeafNameTypeVector.cpp b/src/xercesc/validators/common/ContentLeafNameTypeVector.cpp
index a8b235473..ca46f5002 100644
--- a/src/xercesc/validators/common/ContentLeafNameTypeVector.cpp
+++ b/src/xercesc/validators/common/ContentLeafNameTypeVector.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.3  2003/05/15 18:48:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.2  2002/11/04 14:54:58  tng
  * C++ Namespace Support.
  *
@@ -77,7 +80,6 @@
 // ---------------------------------------------------------------------------
 //  Includes
 // ---------------------------------------------------------------------------
-#include <xercesc/util/XercesDefs.hpp>
 #include <xercesc/validators/common/ContentLeafNameTypeVector.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
@@ -85,19 +87,26 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  ContentLeafNameTypeVector: Constructors and Destructor
 // ---------------------------------------------------------------------------
-ContentLeafNameTypeVector::ContentLeafNameTypeVector()
-: fLeafNames(0)
+ContentLeafNameTypeVector::ContentLeafNameTypeVector
+(
+    MemoryManager* const manager
+)
+: fMemoryManager(manager)
+, fLeafNames(0)
 , fLeafTypes(0)
 , fLeafCount(0)
 {
 }
 
 ContentLeafNameTypeVector::ContentLeafNameTypeVector
-       (    QName** const                      names
-          , ContentSpecNode::NodeTypes* const  types
-          , const unsigned int                       count
-       )
-: fLeafNames(0)
+(
+      QName** const                     names
+    , ContentSpecNode::NodeTypes* const types
+    , const unsigned int                count
+    , MemoryManager* const              manager
+)
+: fMemoryManager(manager)
+, fLeafNames(0)
 , fLeafTypes(0)
 , fLeafCount(0)
 {
@@ -108,10 +117,13 @@ ContentLeafNameTypeVector::ContentLeafNameTypeVector
 copy ctor
 ***/
 ContentLeafNameTypeVector::ContentLeafNameTypeVector
-      (const ContentLeafNameTypeVector& toCopy)
-	  :fLeafNames(0)
-	  ,fLeafTypes(0)
-	  ,fLeafCount(0)
+(
+    const ContentLeafNameTypeVector& toCopy
+)
+: fMemoryManager(toCopy.fMemoryManager)
+, fLeafNames(0)
+, fLeafTypes(0)
+, fLeafCount(0)
 {
     fLeafCount=toCopy.getLeafCount();
     init(fLeafCount);
diff --git a/src/xercesc/validators/common/ContentLeafNameTypeVector.hpp b/src/xercesc/validators/common/ContentLeafNameTypeVector.hpp
index e08b76333..b46558270 100644
--- a/src/xercesc/validators/common/ContentLeafNameTypeVector.hpp
+++ b/src/xercesc/validators/common/ContentLeafNameTypeVector.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.4  2003/05/15 18:48:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2003/03/07 18:16:57  tng
  * Return a reference instead of void for operator=
  *
@@ -83,13 +86,12 @@
 #if !defined(CONTENTLEAFNAMETYPEVECTOR_HPP)
 #define CONTENTLEAFNAMETYPEVECTOR_HPP
 
-#include <xercesc/util/XercesDefs.hpp>
-#include <xercesc/util/ValueVectorOf.hpp>
 #include <xercesc/validators/common/ContentSpecNode.hpp>
+#include <xercesc/framework/MemoryManager.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
-class ContentLeafNameTypeVector
+class ContentLeafNameTypeVector : public XMemory
 {
 public :
     // -----------------------------------------------------------------------
@@ -100,12 +102,13 @@ public :
     // -----------------------------------------------------------------------
     //  Constructors and Destructor
     // -----------------------------------------------------------------------
-    ContentLeafNameTypeVector();
+    ContentLeafNameTypeVector(MemoryManager* const manager);
     ContentLeafNameTypeVector
     (
-        QName** const                      qName
-      , ContentSpecNode::NodeTypes* const  types
-      , const unsigned int                       count
+        QName** const                     qName
+      , ContentSpecNode::NodeTypes* const types
+      , const unsigned int                count
+      , MemoryManager* const              manager
     );
 
     ~ContentLeafNameTypeVector();
@@ -150,6 +153,7 @@ private :
     //  Private Data Members
     //
     // -----------------------------------------------------------------------
+    MemoryManager*                fMemoryManager;
     QName**                       fLeafNames;
     ContentSpecNode::NodeTypes   *fLeafTypes;
     unsigned int                  fLeafCount;
@@ -157,15 +161,18 @@ private :
 
 inline void ContentLeafNameTypeVector::cleanUp()
 {
-	delete [] fLeafNames;
-	delete [] fLeafTypes;
+	fMemoryManager->deallocate(fLeafNames); //delete [] fLeafNames;
+	fMemoryManager->deallocate(fLeafTypes); //delete [] fLeafTypes;
 }
 
 inline void ContentLeafNameTypeVector::init(const unsigned int size)
 {
-	fLeafNames = new QName*[size];
-	fLeafTypes = new ContentSpecNode::NodeTypes [size];
-	fLeafCount = size;
+    fLeafNames = (QName**) fMemoryManager->allocate(size * sizeof(QName*));//new QName*[size];
+    fLeafTypes = (ContentSpecNode::NodeTypes *) fMemoryManager->allocate
+    (
+        size * sizeof(ContentSpecNode::NodeTypes)
+    ); //new ContentSpecNode::NodeTypes [size];
+    fLeafCount = size;
 }
 
 XERCES_CPP_NAMESPACE_END
diff --git a/src/xercesc/validators/common/ContentSpecNode.cpp b/src/xercesc/validators/common/ContentSpecNode.cpp
index 26f29196d..4b20af4b3 100644
--- a/src/xercesc/validators/common/ContentSpecNode.cpp
+++ b/src/xercesc/validators/common/ContentSpecNode.cpp
@@ -81,23 +81,24 @@ XERCES_CPP_NAMESPACE_BEGIN
 //        aka inline function compilation error on AIX 4.2, xlC 3 r ev.1
 // ---------------------------------------------------------------------------
 
-ContentSpecNode::ContentSpecNode(const ContentSpecNode& toCopy)
+ContentSpecNode::ContentSpecNode(const ContentSpecNode& toCopy) :
+    fMemoryManager(XMLPlatformUtils::fgMemoryManager)
 {
     const QName* tempElement = toCopy.getElement();
     if (tempElement)
-        fElement = new QName(*tempElement);
+        fElement = new (fMemoryManager) QName(*tempElement);
     else
         fElement = 0;
 
     const ContentSpecNode *tmp = toCopy.getFirst();
     if (tmp)
-        fFirst = new ContentSpecNode(*tmp);
+        fFirst = new (fMemoryManager) ContentSpecNode(*tmp);
     else
         fFirst = 0;
 
     tmp = toCopy.getSecond();
     if (tmp)
-        fSecond = new ContentSpecNode(*tmp);
+        fSecond = new (fMemoryManager) ContentSpecNode(*tmp);
     else
         fSecond = 0;
 
diff --git a/src/xercesc/validators/common/ContentSpecNode.hpp b/src/xercesc/validators/common/ContentSpecNode.hpp
index 8b5795636..6ef7a1b9b 100644
--- a/src/xercesc/validators/common/ContentSpecNode.hpp
+++ b/src/xercesc/validators/common/ContentSpecNode.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.6  2003/05/15 18:48:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.5  2002/11/04 14:54:58  tng
  * C++ Namespace Support.
  *
@@ -158,8 +161,8 @@
 #if !defined(CONTENTSPECNODE_HPP)
 #define CONTENTSPECNODE_HPP
 
-#include <xercesc/util/XercesDefs.hpp>
 #include <xercesc/framework/XMLElementDecl.hpp>
+#include <xercesc/framework/MemoryManager.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -167,7 +170,7 @@ class XMLBuffer;
 class Grammar;
 
 
-class ContentSpecNode
+class ContentSpecNode : public XMemory
 {
 public :
     // -----------------------------------------------------------------------
@@ -296,6 +299,7 @@ private :
     //      Indicate the maximum times that this node can occur
     //      -1 (Unbounded), default (1)
     // -----------------------------------------------------------------------
+    MemoryManager*      fMemoryManager;
     QName*              fElement;
     ContentSpecNode*    fFirst;
     ContentSpecNode*    fSecond;
@@ -311,7 +315,8 @@ private :
 // ---------------------------------------------------------------------------
 inline ContentSpecNode::ContentSpecNode() :
 
-    fElement(0)
+    fMemoryManager(XMLPlatformUtils::fgMemoryManager)
+    , fElement(0)
     , fFirst(0)
     , fSecond(0)
     , fType(ContentSpecNode::Leaf)
@@ -325,7 +330,8 @@ inline ContentSpecNode::ContentSpecNode() :
 inline
 ContentSpecNode::ContentSpecNode(QName* const element) :
 
-    fElement(0)
+    fMemoryManager(XMLPlatformUtils::fgMemoryManager)
+    , fElement(0)
     , fFirst(0)
     , fSecond(0)
     , fType(ContentSpecNode::Leaf)
@@ -335,14 +341,15 @@ ContentSpecNode::ContentSpecNode(QName* const element) :
     , fMaxOccurs(1)
 {
     if (element)
-        fElement = new QName(*element);
+        fElement = new (fMemoryManager) QName(*element);
 }
 
 inline
 ContentSpecNode::ContentSpecNode(QName* const element
                                , const bool copyQName) :
 
-    fElement(0)
+    fMemoryManager(XMLPlatformUtils::fgMemoryManager)
+    , fElement(0)
     , fFirst(0)
     , fSecond(0)
     , fType(ContentSpecNode::Leaf)
@@ -354,7 +361,7 @@ ContentSpecNode::ContentSpecNode(QName* const element
     if (copyQName)
     {
         if (element)
-            fElement = new QName(*element);
+            fElement = new (fMemoryManager) QName(*element);
     }
     else
     {
@@ -369,7 +376,8 @@ ContentSpecNode::ContentSpecNode(const  NodeTypes               type
                                 , const bool                    adoptFirst
                                 , const bool                    adoptSecond) :
 
-    fElement(0)
+    fMemoryManager(XMLPlatformUtils::fgMemoryManager)
+    , fElement(0)
     , fFirst(firstAdopt)
     , fSecond(secondAdopt)
     , fType(type)
@@ -476,7 +484,7 @@ inline void ContentSpecNode::setElement(QName* const element)
     delete fElement;
     fElement = 0;
     if (element)
-        fElement = new QName(*element);
+        fElement = new (fMemoryManager) QName(*element);
 }
 
 inline void ContentSpecNode::setFirst(ContentSpecNode* const toAdopt)
diff --git a/src/xercesc/validators/common/DFAContentModel.cpp b/src/xercesc/validators/common/DFAContentModel.cpp
index f7f5efec7..9fb0dd3fb 100644
--- a/src/xercesc/validators/common/DFAContentModel.cpp
+++ b/src/xercesc/validators/common/DFAContentModel.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.5  2003/05/15 18:48:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.4  2002/11/04 14:54:58  tng
  * C++ Namespace Support.
  *
@@ -222,8 +225,9 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  DFAContentModel: Constructors and Destructor
 // ---------------------------------------------------------------------------
-DFAContentModel::DFAContentModel(const bool             dtd
-                               , ContentSpecNode* const elemContentSpec) :
+DFAContentModel::DFAContentModel( const bool             dtd
+                                , ContentSpecNode* const elemContentSpec
+                                , MemoryManager* const   manager) :
 
     fElemMap(0)
     , fElemMapType(0)
@@ -240,14 +244,16 @@ DFAContentModel::DFAContentModel(const bool             dtd
     , fDTD(dtd)
     , fIsMixed(false)
     , fLeafNameTypeVector(0)
+    , fMemoryManager(manager)
 {
     // And build the DFA data structures
     buildDFA(elemContentSpec);
 }
 
-DFAContentModel::DFAContentModel(const bool             dtd
-                               , ContentSpecNode* const elemContentSpec
-                               , const bool             isMixed ):
+DFAContentModel::DFAContentModel( const bool             dtd
+                                , ContentSpecNode* const elemContentSpec
+                                , const bool             isMixed
+                                , MemoryManager* const   manager):
 
     fElemMap(0)
     , fElemMapType(0)
@@ -264,6 +270,7 @@ DFAContentModel::DFAContentModel(const bool             dtd
     , fDTD(dtd)
     , fIsMixed(isMixed)
     , fLeafNameTypeVector(0)
+    , fMemoryManager(manager)
 {
     // And build the DFA data structures
     buildDFA(elemContentSpec);
@@ -275,19 +282,19 @@ DFAContentModel::~DFAContentModel()
     //  Clean up all the stuff that is not just temporary representation
     //  data that was cleaned up after building the DFA.
     //
-    delete [] fFinalStateFlags;
+    fMemoryManager->deallocate(fFinalStateFlags); //delete [] fFinalStateFlags;
 
     unsigned index;
     for (index = 0; index < fTransTableSize; index++)
-        delete [] fTransTable[index];
-    delete [] fTransTable;
+        fMemoryManager->deallocate(fTransTable[index]); //delete [] fTransTable[index];
+    fMemoryManager->deallocate(fTransTable); //delete [] fTransTable;
 
     for (index = 0; index < fLeafCount; index++)
         delete fElemMap[index];
-    delete [] fElemMap;
+    fMemoryManager->deallocate(fElemMap); //delete [] fElemMap;
 
-    delete [] fElemMapType;
-    delete [] fLeafListType;
+    fMemoryManager->deallocate(fElemMapType); //delete [] fElemMapType;
+    fMemoryManager->deallocate(fLeafListType); //delete [] fLeafListType;
 
 	delete fLeafNameTypeVector;
 }
@@ -536,17 +543,25 @@ void DFAContentModel::buildDFA(ContentSpecNode* const curNode)
     //  DFA state position and count the number of such leafs, which is left
     //  in the fLeafCount member.
     //
-    CMLeaf* nodeEOC = new CMLeaf(new QName(XMLUni::fgZeroLenString,
-                                           XMLUni::fgZeroLenString,
-                                           XMLContentModel::gEOCFakeId)
-                                 , ~0
-                                 , true);
+    CMLeaf* nodeEOC = new (fMemoryManager) CMLeaf
+    (
+        new (fMemoryManager) QName
+        (
+            XMLUni::fgZeroLenString
+            , XMLUni::fgZeroLenString
+            , XMLContentModel::gEOCFakeId
+        )
+        , ~0
+        , true
+        , fMemoryManager
+    );
     CMNode* nodeOrgContent = buildSyntaxTree(curNode);
-    fHeadNode = new CMBinaryOp
+    fHeadNode = new (fMemoryManager) CMBinaryOp
     (
         ContentSpecNode::Sequence
         , nodeOrgContent
         , nodeEOC
+        , fMemoryManager
     );
 
     //
@@ -573,8 +588,11 @@ void DFAContentModel::buildDFA(ContentSpecNode* const curNode)
     //  initial tree build (which built their position numbers, we will put
     //  them in the array according to their position values.
     //
-    fLeafList = new CMLeaf*[fLeafCount];
-    fLeafListType = new ContentSpecNode::NodeTypes[fLeafCount];
+    fLeafList = (CMLeaf**) fMemoryManager->allocate(fLeafCount*sizeof(CMLeaf*)); //new CMLeaf*[fLeafCount];
+    fLeafListType = (ContentSpecNode::NodeTypes*) fMemoryManager->allocate
+    (
+        fLeafCount * sizeof(ContentSpecNode::NodeTypes)
+    ); //new ContentSpecNode::NodeTypes[fLeafCount];
     postTreeBuildInit(fHeadNode, 0);
 
     //
@@ -582,9 +600,12 @@ void DFAContentModel::buildDFA(ContentSpecNode* const curNode)
     //  for all the nodes. So we allocate an array of pointers to state sets,
     //  one for each leaf node (i.e. each significant DFA position.)
     //
-    fFollowList = new CMStateSet*[fLeafCount];
+    fFollowList = (CMStateSet**) fMemoryManager->allocate
+    (
+        fLeafCount * sizeof(CMStateSet*)
+    ); //new CMStateSet*[fLeafCount];
     for (index = 0; index < fLeafCount; index++)
-        fFollowList[index] = new CMStateSet(fLeafCount);
+        fFollowList[index] = new (fMemoryManager) CMStateSet(fLeafCount, fMemoryManager);
     calcFollowList(fHeadNode);
 
     //
@@ -608,18 +629,24 @@ void DFAContentModel::buildDFA(ContentSpecNode* const curNode)
     //  So we need to a zero based range of indexes that map to element types.
     //  This element map provides that mapping.
     //
-    fElemMap = new QName*[fLeafCount];
-    fElemMapType = new ContentSpecNode::NodeTypes[fLeafCount];
+    fElemMap = (QName**) fMemoryManager->allocate
+    (
+        fLeafCount * sizeof(QName*)
+    ); //new QName*[fLeafCount];
+    fElemMapType = (ContentSpecNode::NodeTypes*) fMemoryManager->allocate
+    (
+        fLeafCount * sizeof(ContentSpecNode::NodeTypes)
+    ); //new ContentSpecNode::NodeTypes[fLeafCount];
     fElemMapSize = 0;
 
 
     for (unsigned int outIndex = 0; outIndex < fLeafCount; outIndex++)
     {
-        fElemMap[outIndex] = new QName();
+        fElemMap[outIndex] = new (fMemoryManager) QName();
 
         if ( (fLeafListType[outIndex] & 0x0f) != ContentSpecNode::Leaf )
             if (!fLeafNameTypeVector)
-                fLeafNameTypeVector = new ContentLeafNameTypeVector();
+                fLeafNameTypeVector = new (fMemoryManager) ContentLeafNameTypeVector(fMemoryManager);
 
         // Get the current leaf's element index
         const QName* element = fLeafList[outIndex]->getElement();
@@ -668,7 +695,10 @@ void DFAContentModel::buildDFA(ContentSpecNode* const curNode)
      **/
     // don't forget to delete it
 
-    int *fLeafSorter = new int[fLeafCount + fElemMapSize];
+    int *fLeafSorter = (int*) fMemoryManager->allocate
+    (
+        (fLeafCount + fElemMapSize) * sizeof(int)
+    ); //new int[fLeafCount + fElemMapSize];
     unsigned int fSortCount = 0;
 
     for (unsigned int elemIndex = 0; elemIndex < fElemMapSize; elemIndex++)
@@ -710,15 +740,25 @@ void DFAContentModel::buildDFA(ContentSpecNode* const curNode)
     //  have to expand though, it if does, the overhead will be somewhat ugly.
     //
     unsigned int curArraySize = fLeafCount * 4;
-    const CMStateSet** statesToDo = new const CMStateSet*[curArraySize];
-    fFinalStateFlags = new bool[curArraySize];
-    fTransTable = new unsigned int*[curArraySize];
+    const CMStateSet** statesToDo = (const CMStateSet**) 
+        fMemoryManager->allocate
+        (
+            curArraySize * sizeof(const CMStateSet*)
+        ); //new const CMStateSet*[curArraySize];
+    fFinalStateFlags = (bool*) fMemoryManager->allocate
+    (
+        curArraySize * sizeof(bool)
+    ); //new bool[curArraySize];
+    fTransTable = (unsigned int**) fMemoryManager->allocate
+    (
+        curArraySize * sizeof(unsigned int*)
+    ); //new unsigned int*[curArraySize];
 
     //
     //  Ok we start with the initial set as the first pos set of the head node
     //  (which is the seq node that holds the content model and the EOC node.)
     //
-    const CMStateSet* setT = new CMStateSet(fHeadNode->getFirstPos());
+    const CMStateSet* setT = new (fMemoryManager) CMStateSet(fHeadNode->getFirstPos());
 
     //
     //  Init our two state flags. Basically the unmarked state counter is
@@ -747,8 +787,14 @@ void DFAContentModel::buildDFA(ContentSpecNode* const curNode)
     //
     // TODO: in the future, we may change the 29 to something
     //       derived from curArraySize.
-    RefHashTableOf<XMLInteger> *stateTable = new RefHashTableOf<XMLInteger>(curArraySize, true, new HashCMStateSet());
-    //stateTable->put((CMStateSet*)setT, new XMLInteger(0));
+    RefHashTableOf<XMLInteger> *stateTable =
+        new (fMemoryManager) RefHashTableOf<XMLInteger>
+        (
+            curArraySize
+            , true
+            , new (fMemoryManager) HashCMStateSet()
+        );
+    //stateTable->put((CMStateSet*)setT, new (fMemoryManager) XMLInteger(0));
 
     //
     //  Ok, almost done with the algorithm from hell... We now enter the
@@ -785,7 +831,11 @@ void DFAContentModel::buildDFA(ContentSpecNode* const curNode)
             //  one. Otherwise, zero out the existing one.
             //
             if (!newSet)
-                newSet = new CMStateSet(fLeafCount);
+                newSet = new (fMemoryManager) CMStateSet
+                (
+                    fLeafCount
+                    , fMemoryManager
+                );
             else
                 newSet->zeroBits();
 
@@ -868,7 +918,11 @@ void DFAContentModel::buildDFA(ContentSpecNode* const curNode)
                     //
                     statesToDo[curState] = newSet;
                     fTransTable[curState] = makeDefStateList();
-                    stateTable->put(newSet, new XMLInteger(curState));
+                    stateTable->put
+                    (
+                        newSet
+                        , new (fMemoryManager) XMLInteger(curState)
+                    );
 
                     // We now have a new state to do so bump the count
                     curState++;
@@ -897,9 +951,20 @@ void DFAContentModel::buildDFA(ContentSpecNode* const curNode)
                     //  size by 50% and allocate new arrays.
                     //
                     const unsigned int newSize = (unsigned int)(curArraySize * 1.5);
-                    const CMStateSet** newToDo = new const CMStateSet*[newSize];
-                    bool* newFinalFlags = new bool[newSize];
-                    unsigned int** newTransTable = new unsigned int*[newSize];
+                    const CMStateSet** newToDo = (const CMStateSet**) 
+                        fMemoryManager->allocate
+                        (
+                            newSize * sizeof(const CMStateSet*)
+                        ); //new const CMStateSet*[newSize];
+                    bool* newFinalFlags = (bool*) fMemoryManager->allocate
+                    (
+                        newSize * sizeof(bool)
+                    ); //new bool[newSize];
+                    unsigned int** newTransTable = (unsigned int**)
+                        fMemoryManager->allocate
+                        (
+                            newSize * sizeof(unsigned int*)
+                        ); //new unsigned int*[newSize];
 
                     // Copy over all of the existing content
                     for (unsigned int expIndex = 0; expIndex < curArraySize; expIndex++)
@@ -910,9 +975,9 @@ void DFAContentModel::buildDFA(ContentSpecNode* const curNode)
                     }
 
                     // Clean up the old stuff
-                    delete [] statesToDo;
-                    delete [] fFinalStateFlags;
-                    delete [] fTransTable;
+                    fMemoryManager->deallocate(statesToDo); //delete [] statesToDo;
+                    fMemoryManager->deallocate(fFinalStateFlags); //delete [] fFinalStateFlags;
+                    fMemoryManager->deallocate(fTransTable); //delete [] fTransTable;
 
                     // Store the new array size and pointers
                     curArraySize = newSize;
@@ -951,7 +1016,7 @@ void DFAContentModel::buildDFA(ContentSpecNode* const curNode)
 
     for (index = 0; index < fLeafCount; index++)
         delete fFollowList[index];
-    delete [] fFollowList;
+    fMemoryManager->deallocate(fFollowList); //delete [] fFollowList;
 
     //
     // removeAll() will delete all data, XMLInteger,
@@ -962,13 +1027,13 @@ void DFAContentModel::buildDFA(ContentSpecNode* const curNode)
 
     for (index = 0; index < curState; index++)
         delete (CMStateSet*)statesToDo[index];
-    delete [] statesToDo;
+    fMemoryManager->deallocate(statesToDo); //delete [] statesToDo;
 
     for (index = 0; index < fLeafCount; index++)
         delete fLeafList[index];
-    delete [] fLeafList;
+    fMemoryManager->deallocate(fLeafList); //delete [] fLeafList;
 
-    delete [] fLeafSorter;
+    fMemoryManager->deallocate(fLeafSorter); //delete [] fLeafSorter;
 
 }
 
@@ -985,7 +1050,13 @@ CMNode* DFAContentModel::buildSyntaxTree(ContentSpecNode* const curNode)
         || (curType & 0x0f) == ContentSpecNode::Any_Other
         || (curType & 0x0f) == ContentSpecNode::Any_NS)
     {
-        retNode = new CMAny(curType, curNode->getElement()->getURI(), fLeafCount++);
+        retNode = new (fMemoryManager) CMAny
+        (
+            curType
+            , curNode->getElement()->getURI()
+            , fLeafCount++
+            , fMemoryManager
+        );
     }
     else if (curType == ContentSpecNode::Leaf)
     {
@@ -995,7 +1066,12 @@ CMNode* DFAContentModel::buildSyntaxTree(ContentSpecNode* const curNode)
         //  This makes the positions zero based since we store first and then
         //  increment.
         //
-        retNode = new CMLeaf(curNode->getElement(), fLeafCount++);
+        retNode = new (fMemoryManager) CMLeaf
+        (
+            curNode->getElement()
+            , fLeafCount++
+            , fMemoryManager
+        );
     }
      else
     {
@@ -1016,14 +1092,25 @@ CMNode* DFAContentModel::buildSyntaxTree(ContentSpecNode* const curNode)
             //
             CMNode* newLeft = buildSyntaxTree(leftNode);
             CMNode* newRight = buildSyntaxTree(rightNode);
-            retNode = new CMBinaryOp(curType, newLeft, newRight);
+            retNode = new (fMemoryManager) CMBinaryOp
+            (
+                curType
+                , newLeft
+                , newRight
+                , fMemoryManager
+            );
         }
          else if (curType == ContentSpecNode::ZeroOrMore
                || curType == ContentSpecNode::ZeroOrOne
                || curType == ContentSpecNode::OneOrMore)
         {
             // This one is fine as is, just change to our form
-            retNode = new CMUnaryOp(curType, buildSyntaxTree(leftNode));
+            retNode = new (fMemoryManager) CMUnaryOp
+            (
+                curType
+                , buildSyntaxTree(leftNode)
+                , fMemoryManager
+            );
         }
          else
         {
@@ -1108,7 +1195,10 @@ void DFAContentModel::calcFollowList(CMNode* const curNode)
 //
 unsigned int* DFAContentModel::makeDefStateList() const
 {
-    unsigned int* retArray = new unsigned int[fElemMapSize];
+    unsigned int* retArray = (unsigned int*) fMemoryManager->allocate
+    (
+        fElemMapSize * sizeof(unsigned int)
+    ); //new unsigned int[fElemMapSize];
     for (unsigned int index = 0; index < fElemMapSize; index++)
         retArray[index] = XMLContentModel::gInvalidTrans;
     return retArray;
@@ -1132,11 +1222,18 @@ int DFAContentModel::postTreeBuildInit(         CMNode* const   nodeCur
          ((curType & 0x0f) == ContentSpecNode::Any_NS) ||
          ((curType & 0x0f) == ContentSpecNode::Any_Other)  )
     {
-        fLeafList[newIndex] = new CMLeaf(new QName(XMLUni::fgZeroLenString
-                                                 , XMLUni::fgZeroLenString
-                                                 , ((CMAny*) nodeCur)->getURI())
-                                       , ((CMAny*)nodeCur)->getPosition()
-                                       , true);
+        fLeafList[newIndex] = new (fMemoryManager) CMLeaf
+        (
+            new (fMemoryManager) QName
+            (
+                XMLUni::fgZeroLenString
+                , XMLUni::fgZeroLenString
+                , ((CMAny*) nodeCur)->getURI()
+            )
+            , ((CMAny*)nodeCur)->getPosition()
+            , true
+            , fMemoryManager
+        );
         fLeafListType[newIndex] = curType;
         ++newIndex;
     }
@@ -1166,8 +1263,12 @@ int DFAContentModel::postTreeBuildInit(         CMNode* const   nodeCur
             // will NOT delete the nodeCur --twice--,
             // thuse to make delete the owner of the nodeCur possible.
             //
-            fLeafList[newIndex] = new CMLeaf(((CMLeaf*)nodeCur)->getElement(),
-                                           ((CMLeaf*)nodeCur)->getPosition());
+            fLeafList[newIndex] = new (fMemoryManager) CMLeaf
+            (
+                ((CMLeaf*)nodeCur)->getElement()
+                , ((CMLeaf*)nodeCur)->getPosition()
+                , fMemoryManager
+            );
             fLeafListType[newIndex] = ContentSpecNode::Leaf;
             ++newIndex;
         }
@@ -1214,11 +1315,17 @@ void DFAContentModel::checkUniqueParticleAttribution (SchemaGrammar*    const pG
     // Unique Particle Attribution
     // store the conflict results between any two elements in fElemMap
     // XMLContentModel::gInvalidTrans: not compared; 0: no conflict; 1: conflict
-    unsigned int** fConflictTable = new unsigned int*[fElemMapSize];
+    unsigned int** fConflictTable = (unsigned int**) fMemoryManager->allocate
+    (
+        fElemMapSize * sizeof(unsigned int*)
+    ); //new unsigned int*[fElemMapSize];
 
     // initialize the conflict table
     for (j = 0; j < fElemMapSize; j++) {
-        fConflictTable[j] = new unsigned int[fElemMapSize];
+        fConflictTable[j] = (unsigned int*) fMemoryManager->allocate
+        (
+            fElemMapSize * sizeof(unsigned int)
+        ); //new unsigned int[fElemMapSize];
         for (k = j+1; k < fElemMapSize; k++)
             fConflictTable[j][k] = XMLContentModel::gInvalidTrans;
     }
@@ -1275,8 +1382,8 @@ void DFAContentModel::checkUniqueParticleAttribution (SchemaGrammar*    const pG
     }
 
     for (i = 0; i < fElemMapSize; i++)
-        delete [] fConflictTable[i];
-    delete [] fConflictTable;
+        fMemoryManager->deallocate(fConflictTable[i]); //delete [] fConflictTable[i];
+    fMemoryManager->deallocate(fConflictTable); //delete [] fConflictTable;
 }
 
 XERCES_CPP_NAMESPACE_END
diff --git a/src/xercesc/validators/common/DFAContentModel.hpp b/src/xercesc/validators/common/DFAContentModel.hpp
index 54c7815b4..48c645888 100644
--- a/src/xercesc/validators/common/DFAContentModel.hpp
+++ b/src/xercesc/validators/common/DFAContentModel.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.4  2003/05/15 18:48:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2003/03/07 18:16:57  tng
  * Return a reference instead of void for operator=
  *
@@ -157,12 +160,19 @@ public:
     // -----------------------------------------------------------------------
     //  Constructors and Destructor
     // -----------------------------------------------------------------------
-    DFAContentModel(const bool              dtd
-                  , ContentSpecNode* const  elemContentSpec);
-
-    DFAContentModel(const bool              dtd
-                  , ContentSpecNode* const  elemContentSpec
-                  , const bool              isMixed);
+    DFAContentModel
+    ( 
+          const bool             dtd
+        , ContentSpecNode* const elemContentSpec
+        , MemoryManager* const   manager
+    );
+    DFAContentModel
+    (
+          const bool             dtd
+        , ContentSpecNode* const elemContentSpec
+        , const bool             isMixed
+        , MemoryManager* const   manager
+    );
 
     virtual ~DFAContentModel();
 
@@ -316,6 +326,7 @@ private :
     bool                    fDTD;
     bool                    fIsMixed;
     ContentLeafNameTypeVector *fLeafNameTypeVector;
+    MemoryManager*             fMemoryManager;
 };
 
 
diff --git a/src/xercesc/validators/common/Grammar.hpp b/src/xercesc/validators/common/Grammar.hpp
index e401208e1..3ce470bbb 100644
--- a/src/xercesc/validators/common/Grammar.hpp
+++ b/src/xercesc/validators/common/Grammar.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.5  2003/05/15 18:48:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.4  2002/11/04 14:54:58  tng
  * C++ Namespace Support.
  *
@@ -103,7 +106,7 @@ XERCES_CPP_NAMESPACE_BEGIN
 // This abstract class specifies the interface for a Grammar
 //
 
-class VALIDATORS_EXPORT Grammar
+class VALIDATORS_EXPORT Grammar : public XMemory
 {
 public:
 
diff --git a/src/xercesc/validators/common/GrammarResolver.cpp b/src/xercesc/validators/common/GrammarResolver.cpp
index bd45486cd..58529e2d0 100644
--- a/src/xercesc/validators/common/GrammarResolver.cpp
+++ b/src/xercesc/validators/common/GrammarResolver.cpp
@@ -57,6 +57,9 @@
 
 /*
  * $Log$
+ * Revision 1.6  2003/05/15 18:48:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.5  2002/11/04 14:54:58  tng
  * C++ Namespace Support.
  *
@@ -99,14 +102,15 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  GrammarResolver: Constructor and Destructor
 // ---------------------------------------------------------------------------
-GrammarResolver::GrammarResolver() :
+GrammarResolver::GrammarResolver(MemoryManager* const manager) :
     fCacheGrammar(false)
     , fUseCachedGrammar(false)
     , fGrammarRegistry(0)
     , fCachedGrammarRegistry(0)
     , fDataTypeReg(0)
+    , fMemoryManager(manager)	 
 {
-    fGrammarRegistry = new RefHashTableOf<Grammar>(29, true);
+    fGrammarRegistry = new (manager) RefHashTableOf<Grammar>(29, true);
 }
 
 GrammarResolver::~GrammarResolver()
@@ -130,7 +134,7 @@ GrammarResolver::getDatatypeValidator(const XMLCh* const uriStr,
 
         if (!fDataTypeReg) {
 
-            fDataTypeReg = new DatatypeValidatorFactory();
+            fDataTypeReg = new (fMemoryManager) DatatypeValidatorFactory(fMemoryManager);
             fDataTypeReg->expandRegistryToFullSchemaSet();
         }
 
@@ -222,7 +226,7 @@ void GrammarResolver::cacheGrammars()
     }
 
     if (!fCachedGrammarRegistry)
-        fCachedGrammarRegistry = new RefHashTableOf<Grammar>(29, true);
+        fCachedGrammarRegistry = new (fMemoryManager) RefHashTableOf<Grammar>(29, true);
 
     // Cache
     for (unsigned int i=0; i<keyCount; i++) {
@@ -240,7 +244,7 @@ void GrammarResolver::cacheGrammars()
 void GrammarResolver::cacheGrammarFromParse(const bool aValue) {
 
     if (aValue && !fCachedGrammarRegistry) {
-        fCachedGrammarRegistry = new RefHashTableOf<Grammar>(29, true);
+        fCachedGrammarRegistry = new (fMemoryManager) RefHashTableOf<Grammar>(29, true);
     }
 
     fCacheGrammar = aValue;
diff --git a/src/xercesc/validators/common/GrammarResolver.hpp b/src/xercesc/validators/common/GrammarResolver.hpp
index 1734f200f..11e86ac66 100644
--- a/src/xercesc/validators/common/GrammarResolver.hpp
+++ b/src/xercesc/validators/common/GrammarResolver.hpp
@@ -79,7 +79,8 @@ class DatatypeValidatorFactory;
  *
  */
 
-class VALIDATORS_EXPORT GrammarResolver {
+class VALIDATORS_EXPORT GrammarResolver : public XMemory
+{
 public:
 
     /** @name Constructor and Destructor */
@@ -88,7 +89,7 @@ public:
      *
      * Default Constructor
      */
-    GrammarResolver();
+    GrammarResolver(MemoryManager* const manager);
 
     /**
       * Destructor
@@ -208,6 +209,8 @@ private:
     //
     //  fDataTypeReg           DatatypeValidatorFactory registery
     //
+    //  fMemoryManager         Pluggable memory manager for dynamic memory
+    //                         allocation/deallocation
     // -----------------------------------------------------------------------
     bool                       fCacheGrammar;
     bool                       fUseCachedGrammar;
@@ -215,6 +218,7 @@ private:
     RefHashTableOf<Grammar>*   fGrammarRegistry;
     RefHashTableOf<Grammar>*   fCachedGrammarRegistry;
     DatatypeValidatorFactory*  fDataTypeReg;
+    MemoryManager*             fMemoryManager;
 };
 
 inline XMLStringPool* GrammarResolver::getStringPool() {
diff --git a/src/xercesc/validators/common/MixedContentModel.cpp b/src/xercesc/validators/common/MixedContentModel.cpp
index 9886387f9..e918b819c 100644
--- a/src/xercesc/validators/common/MixedContentModel.cpp
+++ b/src/xercesc/validators/common/MixedContentModel.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.4  2003/05/15 18:48:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/11/04 14:54:58  tng
  * C++ Namespace Support.
  *
@@ -154,6 +157,7 @@ MixedContentModel::MixedContentModel(const bool             dtd
  , fChildTypes(0)
  , fOrdered(ordered)
  , fDTD(dtd)
+ , fMemoryManager(XMLPlatformUtils::fgMemoryManager)
 {
     //
     //  Create a vector of unsigned ints that will be filled in with the
@@ -161,7 +165,6 @@ MixedContentModel::MixedContentModel(const bool             dtd
     //  it an initial capacity of 64 which should be more than enough for
     //  99% of the scenarios.
     //
-
     ValueVectorOf<QName*> children(64);
     ValueVectorOf<ContentSpecNode::NodeTypes> childTypes(64);
 
@@ -182,8 +185,11 @@ MixedContentModel::MixedContentModel(const bool             dtd
     //  fill them in.
     //
     fCount = children.size();
-    fChildren = new QName*[fCount];
-    fChildTypes = new ContentSpecNode::NodeTypes[fCount];
+    fChildren = (QName**) fMemoryManager->allocate(fCount * sizeof(QName*)); //new QName*[fCount];
+    fChildTypes = (ContentSpecNode::NodeTypes*) fMemoryManager->allocate
+    (
+        fCount * sizeof(ContentSpecNode::NodeTypes)
+    ); //new ContentSpecNode::NodeTypes[fCount];
     for (unsigned int index = 0; index < fCount; index++) {
         fChildren[index] = children.elementAt(index);
         fChildTypes[index] = childTypes.elementAt(index);
@@ -192,8 +198,8 @@ MixedContentModel::MixedContentModel(const bool             dtd
 
 MixedContentModel::~MixedContentModel()
 {
-    delete [] fChildren;
-    delete [] fChildTypes;
+    fMemoryManager->deallocate(fChildren); //delete [] fChildren;
+    fMemoryManager->deallocate(fChildTypes); //delete [] fChildTypes;
 }
 
 
diff --git a/src/xercesc/validators/common/MixedContentModel.hpp b/src/xercesc/validators/common/MixedContentModel.hpp
index 7e255bd7b..73bc0b630 100644
--- a/src/xercesc/validators/common/MixedContentModel.hpp
+++ b/src/xercesc/validators/common/MixedContentModel.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.5  2003/05/15 18:48:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.4  2003/03/07 18:16:57  tng
  * Return a reference instead of void for operator=
  *
@@ -238,12 +241,12 @@ private :
     //      Boolean to allow DTDs to validate even with namespace support.
     //
     // -----------------------------------------------------------------------
-    unsigned int    fCount;
-    QName**         fChildren;
-    ContentSpecNode::NodeTypes*  fChildTypes;
-    bool            fOrdered;
-    bool            fDTD;
-
+    unsigned int                fCount;
+    QName**                     fChildren;
+    ContentSpecNode::NodeTypes* fChildTypes;
+    bool                        fOrdered;
+    bool                        fDTD;
+    MemoryManager*              fMemoryManager;
 };
 
 inline ContentLeafNameTypeVector* MixedContentModel::getContentLeafNameTypeVector() const
diff --git a/src/xercesc/validators/common/SimpleContentModel.hpp b/src/xercesc/validators/common/SimpleContentModel.hpp
index a4b0823f9..3684dd167 100644
--- a/src/xercesc/validators/common/SimpleContentModel.hpp
+++ b/src/xercesc/validators/common/SimpleContentModel.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.5  2003/05/15 18:48:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.4  2003/03/07 18:16:57  tng
  * Return a reference instead of void for operator=
  *
@@ -240,26 +243,27 @@ public :
 // ---------------------------------------------------------------------------
 //  SimpleContentModel: Constructors and Destructor
 // ---------------------------------------------------------------------------
-inline
-SimpleContentModel::SimpleContentModel( const bool                        dtd
-                                      , QName* const                      firstChild
-                                      , QName* const                      secondChild
-                                      , const ContentSpecNode::NodeTypes  cmOp) :
-
-    fFirstChild(0)
+inline SimpleContentModel::SimpleContentModel
+(
+      const bool                       dtd
+    , QName* const                     firstChild
+    , QName* const                     secondChild
+    , const ContentSpecNode::NodeTypes cmOp
+)
+    : fFirstChild(0)
     , fSecondChild(0)
     , fOp(cmOp)
 	, fDTD(dtd)
 {
     if (firstChild)
-        fFirstChild = new QName(*firstChild);
+        fFirstChild = new (XMLPlatformUtils::fgMemoryManager) QName(*firstChild);
     else
-        fFirstChild = new QName(XMLUni::fgZeroLenString, XMLUni::fgZeroLenString, XMLElementDecl::fgInvalidElemId);
+        fFirstChild = new (XMLPlatformUtils::fgMemoryManager) QName(XMLUni::fgZeroLenString, XMLUni::fgZeroLenString, XMLElementDecl::fgInvalidElemId);
 
     if (secondChild)
-        fSecondChild = new QName(*secondChild);
+        fSecondChild = new (XMLPlatformUtils::fgMemoryManager) QName(*secondChild);
     else
-        fSecondChild = new QName(XMLUni::fgZeroLenString, XMLUni::fgZeroLenString, XMLElementDecl::fgInvalidElemId);
+        fSecondChild = new (XMLPlatformUtils::fgMemoryManager) QName(XMLUni::fgZeroLenString, XMLUni::fgZeroLenString, XMLElementDecl::fgInvalidElemId);
 }
 
 inline SimpleContentModel::~SimpleContentModel()
diff --git a/src/xercesc/validators/datatype/AbstractNumericFacetValidator.cpp b/src/xercesc/validators/datatype/AbstractNumericFacetValidator.cpp
index 86c973c5d..716c59e2a 100644
--- a/src/xercesc/validators/datatype/AbstractNumericFacetValidator.cpp
+++ b/src/xercesc/validators/datatype/AbstractNumericFacetValidator.cpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.12  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.11  2003/02/03 16:34:35  peiyongz
  * fix to misplaced derived and base value in error message.
  *
@@ -115,7 +118,6 @@
 //  Includes
 // ---------------------------------------------------------------------------
 #include <xercesc/validators/datatype/AbstractNumericFacetValidator.hpp>
-#include <xercesc/validators/schema/SchemaSymbols.hpp>
 #include <xercesc/validators/datatype/InvalidDatatypeFacetException.hpp>
 #include <xercesc/util/NumberFormatException.hpp>
 
@@ -174,8 +176,9 @@ AbstractNumericFacetValidator::AbstractNumericFacetValidator(
                           DatatypeValidator*            const baseValidator
                         , RefHashTableOf<KVStringPair>* const facets
                         , const int                           finalSet
-                        , const ValidatorType                 type)
-:DatatypeValidator(baseValidator, facets, finalSet, type)
+                        , const ValidatorType                 type
+                        , MemoryManager* const                manager)
+:DatatypeValidator(baseValidator, facets, finalSet, type, manager)
 , fMaxInclusiveInherited(false)
 , fMaxExclusiveInherited(false)
 , fMinInclusiveInherited(false)
@@ -655,6 +658,7 @@ void AbstractNumericFacetValidator::inspectFacetBase()
             {
                 REPORT_FACET_ERROR(thisMinExclusive
                                  , baseMaxInclusive
+
                                  , XMLExcepts::FACET_minExcl_base_maxIncl)
             }
         }
diff --git a/src/xercesc/validators/datatype/AbstractNumericFacetValidator.hpp b/src/xercesc/validators/datatype/AbstractNumericFacetValidator.hpp
index 0b89411a1..d7e55834f 100644
--- a/src/xercesc/validators/datatype/AbstractNumericFacetValidator.hpp
+++ b/src/xercesc/validators/datatype/AbstractNumericFacetValidator.hpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.6  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.5  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -111,10 +114,14 @@ public:
 
 protected:
 
-    AbstractNumericFacetValidator(DatatypeValidator*            const baseValidator
-                                , RefHashTableOf<KVStringPair>* const facets
-                                , const int                           finalSet
-                                , const ValidatorType                 type);
+    AbstractNumericFacetValidator
+    (
+        DatatypeValidator* const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , const int finalSet
+        , const ValidatorType type
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
     void init(RefArrayVectorOf<XMLCh>*  const enums);
 
diff --git a/src/xercesc/validators/datatype/AbstractNumericValidator.cpp b/src/xercesc/validators/datatype/AbstractNumericValidator.cpp
index dde872f3e..a18e904bc 100644
--- a/src/xercesc/validators/datatype/AbstractNumericValidator.cpp
+++ b/src/xercesc/validators/datatype/AbstractNumericValidator.cpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.5  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.4  2003/02/02 23:55:40  peiyongz
  * getFormattedString() added to return original and converted value.
  *
@@ -101,8 +104,9 @@ AbstractNumericValidator::AbstractNumericValidator(
                           DatatypeValidator*            const baseValidator
                         , RefHashTableOf<KVStringPair>* const facets
                         , const int                           finalSet
-                        , const ValidatorType                 type)
-:AbstractNumericFacetValidator(baseValidator, facets, finalSet, type)
+                        , const ValidatorType                 type
+                        , MemoryManager* const                manager)
+:AbstractNumericFacetValidator(baseValidator, facets, finalSet, type, manager)
 {
     //do not invoke init() here !!!
 }
diff --git a/src/xercesc/validators/datatype/AbstractNumericValidator.hpp b/src/xercesc/validators/datatype/AbstractNumericValidator.hpp
index b62c53866..371ebd140 100644
--- a/src/xercesc/validators/datatype/AbstractNumericValidator.hpp
+++ b/src/xercesc/validators/datatype/AbstractNumericValidator.hpp
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 2001 The Apache Software Foundation.  All rights
+ * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -79,7 +82,6 @@
 
 #include <xercesc/validators/datatype/AbstractNumericFacetValidator.hpp>
 #include <xercesc/util/RefVectorOf.hpp>
-#include <xercesc/util/XMLNumber.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -101,10 +103,14 @@ public:
 
 protected:
 
-    AbstractNumericValidator(DatatypeValidator*            const baseValidator
-                           , RefHashTableOf<KVStringPair>* const facets
-                           , const int                           finalSet
-                           , const ValidatorType                 type);
+    AbstractNumericValidator
+    (
+        DatatypeValidator* const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , const int finalSet
+        , const ValidatorType type
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
     inline void init(RefArrayVectorOf<XMLCh>*  const enums);
 
diff --git a/src/xercesc/validators/datatype/AbstractStringValidator.cpp b/src/xercesc/validators/datatype/AbstractStringValidator.cpp
index d8f4750b3..35b75f251 100644
--- a/src/xercesc/validators/datatype/AbstractStringValidator.cpp
+++ b/src/xercesc/validators/datatype/AbstractStringValidator.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.11  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.10  2003/02/22 18:28:26  peiyongz
  * Schema Errata E2-35 Length, minLength and maxLength in different derivation steps.
  *
@@ -122,7 +125,6 @@
 //  Includes
 // ---------------------------------------------------------------------------
 #include <xercesc/validators/datatype/AbstractStringValidator.hpp>
-#include <xercesc/validators/schema/SchemaSymbols.hpp>
 #include <xercesc/validators/datatype/InvalidDatatypeFacetException.hpp>
 #include <xercesc/validators/datatype/InvalidDatatypeValueException.hpp>
 #include <xercesc/util/NumberFormatException.hpp>
@@ -167,8 +169,9 @@ AbstractStringValidator::AbstractStringValidator(
                           DatatypeValidator*            const baseValidator
                         , RefHashTableOf<KVStringPair>* const facets
                         , const int                           finalSet
-                        , const ValidatorType                 type)
-:DatatypeValidator(baseValidator, facets, finalSet, type)
+                        , const ValidatorType                 type
+                        , MemoryManager* const                manager)
+:DatatypeValidator(baseValidator, facets, finalSet, type, manager)
 ,fLength(0)
 ,fMaxLength(SchemaSymbols::fgINT_MAX_VALUE)
 ,fMinLength(0)
@@ -643,7 +646,7 @@ void AbstractStringValidator::checkContent( const XMLCh* const content, bool asB
         // lazy construction
         if (getRegex() ==0) {
             try {
-                setRegex(new RegularExpression(getPattern(), SchemaSymbols::fgRegEx_XOption));
+                setRegex(new (fMemoryManager) RegularExpression(getPattern(), SchemaSymbols::fgRegEx_XOption));
             }
             catch (XMLException &e)
             {
@@ -698,8 +701,8 @@ void AbstractStringValidator::checkContent( const XMLCh* const content, bool asB
     if ((thisFacetsDefined & DatatypeValidator::FACET_ENUMERATION) != 0 &&
         (getEnumeration() != 0))
     {
-        XMLCh* normContent = XMLString::replicate(content);
-        ArrayJanitor<XMLCh>  jan(normContent);
+        XMLCh* normContent = XMLString::replicate(content, fMemoryManager);
+        ArrayJanitor<XMLCh>  jan(normContent, fMemoryManager);
         normalizeContent(normContent);
 
         int i=0;
diff --git a/src/xercesc/validators/datatype/AbstractStringValidator.hpp b/src/xercesc/validators/datatype/AbstractStringValidator.hpp
index 5540c8385..3d34fe4f8 100644
--- a/src/xercesc/validators/datatype/AbstractStringValidator.hpp
+++ b/src/xercesc/validators/datatype/AbstractStringValidator.hpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.8  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.7  2003/01/27 19:24:17  peiyongz
  * normalize Base64 data before checking against enumeration.
  *
@@ -170,10 +173,14 @@ public:
 
 protected:
 
-    AbstractStringValidator(DatatypeValidator*            const baseValidator
-                          , RefHashTableOf<KVStringPair>* const facets
-                          , const int                           finalSet
-                          , const ValidatorType                 type);
+    AbstractStringValidator
+    (
+        DatatypeValidator* const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , const int finalSet
+        , const ValidatorType type
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
     void init(RefArrayVectorOf<XMLCh>*           const enums);
 
diff --git a/src/xercesc/validators/datatype/AnySimpleTypeDatatypeValidator.cpp b/src/xercesc/validators/datatype/AnySimpleTypeDatatypeValidator.cpp
index fbed7be05..7d0e99a0d 100644
--- a/src/xercesc/validators/datatype/AnySimpleTypeDatatypeValidator.cpp
+++ b/src/xercesc/validators/datatype/AnySimpleTypeDatatypeValidator.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.6  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.5  2003/01/13 20:16:51  knoaman
  * [Bug 16024] SchemaSymbols.hpp conflicts C++ Builder 6 dir.h
  *
@@ -82,7 +85,6 @@
 //  Includes
 // ---------------------------------------------------------------------------
 #include <xercesc/validators/datatype/AnySimpleTypeDatatypeValidator.hpp>
-#include <xercesc/validators/schema/SchemaSymbols.hpp>
 #include <xercesc/util/RuntimeException.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
@@ -90,8 +92,8 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  AnySimpleTypeDatatypeValidator: Constructors and Destructor
 // ---------------------------------------------------------------------------
-AnySimpleTypeDatatypeValidator::AnySimpleTypeDatatypeValidator()
-    : DatatypeValidator(0, 0, SchemaSymbols::XSD_RESTRICTION, DatatypeValidator::AnySimpleType)
+AnySimpleTypeDatatypeValidator::AnySimpleTypeDatatypeValidator(MemoryManager* const manager)
+    : DatatypeValidator(0, 0, SchemaSymbols::XSD_RESTRICTION, DatatypeValidator::AnySimpleType, manager)
 {
 
 }
@@ -104,11 +106,14 @@ AnySimpleTypeDatatypeValidator::~AnySimpleTypeDatatypeValidator()
 // ---------------------------------------------------------------------------
 //  AnySimpleTypeDatatypeValidator: Instance methods
 // ---------------------------------------------------------------------------
-DatatypeValidator*
-AnySimpleTypeDatatypeValidator::newInstance(RefHashTableOf<KVStringPair>* const facets,
-                                            RefArrayVectorOf<XMLCh>* const enums,
-                                            const int finalSet) {
-
+DatatypeValidator* AnySimpleTypeDatatypeValidator::newInstance
+(
+      RefHashTableOf<KVStringPair>* const facets
+    , RefArrayVectorOf<XMLCh>* const      enums
+    , const int                           finalSet
+    , MemoryManager* const                manager
+)
+{
     // We own them, so we will delete them first
     delete facets;
     delete enums;
diff --git a/src/xercesc/validators/datatype/AnySimpleTypeDatatypeValidator.hpp b/src/xercesc/validators/datatype/AnySimpleTypeDatatypeValidator.hpp
index 02e6c1ba6..022b6d017 100644
--- a/src/xercesc/validators/datatype/AnySimpleTypeDatatypeValidator.hpp
+++ b/src/xercesc/validators/datatype/AnySimpleTypeDatatypeValidator.hpp
@@ -74,7 +74,10 @@ public:
 	/** @name Constructor */
     //@{
 
-    AnySimpleTypeDatatypeValidator();
+    AnySimpleTypeDatatypeValidator
+    (
+        MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
 	//@}
 
@@ -158,9 +161,13 @@ public:
       * Returns an instance of the base datatype validator class
 	  * Used by the DatatypeValidatorFactory.
       */
-	DatatypeValidator* newInstance(RefHashTableOf<KVStringPair>* const,
-                                   RefArrayVectorOf<XMLCh>* const enums,
-                                   const int finalSet);
+	virtual DatatypeValidator* newInstance
+    (
+        RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 };
 
 
diff --git a/src/xercesc/validators/datatype/AnyURIDatatypeValidator.cpp b/src/xercesc/validators/datatype/AnyURIDatatypeValidator.cpp
index adf7d5675..8ec1e1219 100644
--- a/src/xercesc/validators/datatype/AnyURIDatatypeValidator.cpp
+++ b/src/xercesc/validators/datatype/AnyURIDatatypeValidator.cpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -126,8 +129,8 @@ static const XMLCh BASE_URI[] =
 // ---------------------------------------------------------------------------
 //  Constructors and Destructor
 // ---------------------------------------------------------------------------
-AnyURIDatatypeValidator::AnyURIDatatypeValidator()
-:AbstractStringValidator(0, 0, 0, DatatypeValidator::AnyURI)
+AnyURIDatatypeValidator::AnyURIDatatypeValidator(MemoryManager* const manager)
+:AbstractStringValidator(0, 0, 0, DatatypeValidator::AnyURI, manager)
 ,fTempURI(0)
 {}
 
@@ -140,8 +143,9 @@ AnyURIDatatypeValidator::AnyURIDatatypeValidator(
                           DatatypeValidator*            const baseValidator
                         , RefHashTableOf<KVStringPair>* const facets
                         , RefArrayVectorOf<XMLCh>*           const enums
-                        , const int                           finalSet)
-:AbstractStringValidator(baseValidator, facets, finalSet, DatatypeValidator::AnyURI)
+                        , const int                           finalSet
+                        , MemoryManager* const manager)
+:AbstractStringValidator(baseValidator, facets, finalSet, DatatypeValidator::AnyURI, manager)
 ,fTempURI(0)
 {
     try
@@ -158,9 +162,10 @@ AnyURIDatatypeValidator::AnyURIDatatypeValidator(
 DatatypeValidator* AnyURIDatatypeValidator::newInstance(
                                       RefHashTableOf<KVStringPair>* const facets
                                     , RefArrayVectorOf<XMLCh>*           const enums
-                                    , const int                           finalSet)
+                                    , const int                           finalSet
+                                    , MemoryManager* const manager)
 {
-    return (DatatypeValidator*) new AnyURIDatatypeValidator(this, facets, enums, finalSet);
+    return (DatatypeValidator*) new AnyURIDatatypeValidator(this, facets, enums, finalSet, manager);
 }
 
 // ---------------------------------------------------------------------------
diff --git a/src/xercesc/validators/datatype/AnyURIDatatypeValidator.hpp b/src/xercesc/validators/datatype/AnyURIDatatypeValidator.hpp
index 9e7edb787..5ca7fda85 100644
--- a/src/xercesc/validators/datatype/AnyURIDatatypeValidator.hpp
+++ b/src/xercesc/validators/datatype/AnyURIDatatypeValidator.hpp
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 2001 The Apache Software Foundation.  All rights
+ * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -111,16 +114,21 @@ public:
     // -----------------------------------------------------------------------
     //  Public ctor/dtor
     // -----------------------------------------------------------------------
-	/** @name Constructor. */
+	/** @name Constructors and Destructor */
     //@{
 
-    AnyURIDatatypeValidator();
-
-    AnyURIDatatypeValidator(DatatypeValidator*            const baseValidator
-                          , RefHashTableOf<KVStringPair>* const facets
-                          , RefArrayVectorOf<XMLCh>*           const enums
-                          , const int                           finalSet);
-
+    AnyURIDatatypeValidator
+    (
+        MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
+    AnyURIDatatypeValidator
+    (
+        DatatypeValidator* const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
     virtual ~AnyURIDatatypeValidator();
 
 	//@}
@@ -129,9 +137,13 @@ public:
       * Returns an instance of the base datatype validator class
 	  * Used by the DatatypeValidatorFactory.
       */
-    virtual DatatypeValidator* newInstance(RefHashTableOf<KVStringPair>* const facets
-                                         , RefArrayVectorOf<XMLCh>*           const enums
-                                         , const int                           finalSet);
+    virtual DatatypeValidator* newInstance
+    (
+        RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
 protected:
 
diff --git a/src/xercesc/validators/datatype/Base64BinaryDatatypeValidator.cpp b/src/xercesc/validators/datatype/Base64BinaryDatatypeValidator.cpp
index baf5d4fb0..cf123a778 100644
--- a/src/xercesc/validators/datatype/Base64BinaryDatatypeValidator.cpp
+++ b/src/xercesc/validators/datatype/Base64BinaryDatatypeValidator.cpp
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 2001 The Apache Software Foundation.  All rights
+ * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.6  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.5  2003/01/27 19:24:17  peiyongz
  * normalize Base64 data before checking against enumeration.
  *
@@ -123,8 +126,8 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  Constructors and Destructor
 // ---------------------------------------------------------------------------
-Base64BinaryDatatypeValidator::Base64BinaryDatatypeValidator()
-:AbstractStringValidator(0, 0, 0, DatatypeValidator::Base64Binary)
+Base64BinaryDatatypeValidator::Base64BinaryDatatypeValidator(MemoryManager* const manager)
+:AbstractStringValidator(0, 0, 0, DatatypeValidator::Base64Binary, manager)
 {}
 
 Base64BinaryDatatypeValidator::~Base64BinaryDatatypeValidator()
@@ -133,19 +136,23 @@ Base64BinaryDatatypeValidator::~Base64BinaryDatatypeValidator()
 Base64BinaryDatatypeValidator::Base64BinaryDatatypeValidator(
                           DatatypeValidator*            const baseValidator
                         , RefHashTableOf<KVStringPair>* const facets
-                        , RefArrayVectorOf<XMLCh>*           const enums
-                        , const int                           finalSet)
-:AbstractStringValidator(baseValidator, facets, finalSet, DatatypeValidator::Base64Binary)
+                        , RefArrayVectorOf<XMLCh>*      const enums
+                        , const int                           finalSet
+                        , MemoryManager* const                manager)
+:AbstractStringValidator(baseValidator, facets, finalSet, DatatypeValidator::Base64Binary, manager)
 {
     init(enums);
 }
 
-DatatypeValidator* Base64BinaryDatatypeValidator::newInstance(
-                                      RefHashTableOf<KVStringPair>* const facets
-                                    , RefArrayVectorOf<XMLCh>*           const enums
-                                    , const int                           finalSet)
+DatatypeValidator* Base64BinaryDatatypeValidator::newInstance
+(
+      RefHashTableOf<KVStringPair>* const facets
+    , RefArrayVectorOf<XMLCh>* const      enums
+    , const int                           finalSet
+    , MemoryManager* const                manager
+)
 {
-    return (DatatypeValidator*) new Base64BinaryDatatypeValidator(this, facets, enums, finalSet);
+    return (DatatypeValidator*) new (manager) Base64BinaryDatatypeValidator(this, facets, enums, finalSet, manager);
 }
 
 // ---------------------------------------------------------------------------
diff --git a/src/xercesc/validators/datatype/Base64BinaryDatatypeValidator.hpp b/src/xercesc/validators/datatype/Base64BinaryDatatypeValidator.hpp
index f4b721e47..a2f4e3fe2 100644
--- a/src/xercesc/validators/datatype/Base64BinaryDatatypeValidator.hpp
+++ b/src/xercesc/validators/datatype/Base64BinaryDatatypeValidator.hpp
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 1999-2001 The Apache Software Foundation.  All rights
+ * Copyright (c) 1999-2003 The Apache Software Foundation.  All rights
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.6  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.5  2003/01/27 19:24:17  peiyongz
  * normalize Base64 data before checking against enumeration.
  *
@@ -94,16 +97,21 @@ public:
     // -----------------------------------------------------------------------
     //  Public ctor/dtor
     // -----------------------------------------------------------------------
-	/** @name Constructor. */
+	/** @name Constructors and Destructor */
     //@{
 
-    Base64BinaryDatatypeValidator();
-
-    Base64BinaryDatatypeValidator(DatatypeValidator*            const baseValidator
-                                , RefHashTableOf<KVStringPair>* const facets
-                                , RefArrayVectorOf<XMLCh>*           const enums
-                                , const int                           finalSet);
-
+    Base64BinaryDatatypeValidator
+    (
+        MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
+    Base64BinaryDatatypeValidator
+    (
+        DatatypeValidator* const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
     virtual ~Base64BinaryDatatypeValidator();
 
 	//@}
@@ -112,9 +120,13 @@ public:
       * Returns an instance of the base datatype validator class
 	  * Used by the DatatypeValidatorFactory.
       */
-    virtual DatatypeValidator* newInstance(RefHashTableOf<KVStringPair>* const facets
-                                         , RefArrayVectorOf<XMLCh>*           const enums
-                                         , const int                           finalSet);
+    virtual DatatypeValidator* newInstance
+    (
+        RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
 protected:
 
diff --git a/src/xercesc/validators/datatype/BooleanDatatypeValidator.cpp b/src/xercesc/validators/datatype/BooleanDatatypeValidator.cpp
index a5da5d201..e207c1899 100644
--- a/src/xercesc/validators/datatype/BooleanDatatypeValidator.cpp
+++ b/src/xercesc/validators/datatype/BooleanDatatypeValidator.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.7  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.6  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -122,9 +125,10 @@ const XMLCh fgValueSpace[][32] =
 BooleanDatatypeValidator::BooleanDatatypeValidator(
                           DatatypeValidator*            const baseValidator
                         , RefHashTableOf<KVStringPair>* const facets
-                        , RefArrayVectorOf<XMLCh>*           const enums
-                        , const int                           finalSet)
-:DatatypeValidator(baseValidator, facets, finalSet, DatatypeValidator::Boolean)
+                        , RefArrayVectorOf<XMLCh>*      const enums
+                        , const int                           finalSet
+                        , MemoryManager* const                manager)
+:DatatypeValidator(baseValidator, facets, finalSet, DatatypeValidator::Boolean, manager)
 {
 
     // Set Facets if any defined
@@ -180,7 +184,7 @@ void BooleanDatatypeValidator::checkContent( const XMLCh* const content, bool as
         // lazy construction
         if (getRegex() ==0) {
             try {
-                setRegex(new RegularExpression(getPattern(), SchemaSymbols::fgRegEx_XOption));
+                setRegex(new (fMemoryManager) RegularExpression(getPattern(), SchemaSymbols::fgRegEx_XOption));
             }
             catch (XMLException &e)
             {
diff --git a/src/xercesc/validators/datatype/BooleanDatatypeValidator.hpp b/src/xercesc/validators/datatype/BooleanDatatypeValidator.hpp
index a2c5fd308..16403204d 100644
--- a/src/xercesc/validators/datatype/BooleanDatatypeValidator.hpp
+++ b/src/xercesc/validators/datatype/BooleanDatatypeValidator.hpp
@@ -75,12 +75,18 @@ public:
 	/** @name Constructor. */
     //@{
 
-    BooleanDatatypeValidator();
-
-    BooleanDatatypeValidator(DatatypeValidator*            const baseValidator
-                           , RefHashTableOf<KVStringPair>* const facets
-                           , RefArrayVectorOf<XMLCh>*           const enums
-                           , const int                           finalSet);
+    BooleanDatatypeValidator
+    (
+        MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
+    BooleanDatatypeValidator
+    (
+        DatatypeValidator* const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
     virtual ~BooleanDatatypeValidator();
 
@@ -136,9 +142,13 @@ public:
       * Returns an instance of the base datatype validator class
 	  * Used by the DatatypeValidatorFactory.
       */
-    DatatypeValidator* newInstance(RefHashTableOf<KVStringPair>* const facets
-                                 , RefArrayVectorOf<XMLCh>*           const enums
-                                 , const int                           finalSet);
+    DatatypeValidator* newInstance
+    (
+        RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
 private:
 
@@ -154,8 +164,8 @@ private:
 // ---------------------------------------------------------------------------
 //  Constructors and Destructor
 // ---------------------------------------------------------------------------
-inline BooleanDatatypeValidator::BooleanDatatypeValidator()
-:DatatypeValidator(0, 0, 0, DatatypeValidator::Boolean)
+inline BooleanDatatypeValidator::BooleanDatatypeValidator(MemoryManager* const manager)
+:DatatypeValidator(0, 0, 0, DatatypeValidator::Boolean, manager)
 {
 }
 
@@ -172,12 +182,15 @@ inline BooleanDatatypeValidator::~BooleanDatatypeValidator()
 // Compare methods
 // -----------------------------------------------------------------------
 
-inline DatatypeValidator* BooleanDatatypeValidator::newInstance(
-                                    RefHashTableOf<KVStringPair>* const facets
-                                    , RefArrayVectorOf<XMLCh>*           const enums
-                                    , const int                           finalSet)
+inline DatatypeValidator* BooleanDatatypeValidator::newInstance
+(
+      RefHashTableOf<KVStringPair>* const facets
+    , RefArrayVectorOf<XMLCh>* const      enums
+    , const int                           finalSet
+    , MemoryManager* const                manager
+)
 {
-    return (DatatypeValidator*) new BooleanDatatypeValidator(this, facets, enums, finalSet);
+    return (DatatypeValidator*) new (manager) BooleanDatatypeValidator(this, facets, enums, finalSet, manager);
 }
 
 inline void BooleanDatatypeValidator::validate( const XMLCh* const content)
diff --git a/src/xercesc/validators/datatype/DatatypeValidator.cpp b/src/xercesc/validators/datatype/DatatypeValidator.cpp
index 7da8ee35e..1c45cce87 100644
--- a/src/xercesc/validators/datatype/DatatypeValidator.cpp
+++ b/src/xercesc/validators/datatype/DatatypeValidator.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.6  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.5  2003/01/29 19:52:32  gareth
  * PSVI API additions.
  *
@@ -99,6 +102,7 @@
 //  Includes
 // ---------------------------------------------------------------------------
 #include <xercesc/validators/datatype/DatatypeValidator.hpp>
+#include <xercesc/framework/MemoryManager.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -108,8 +112,11 @@ XERCES_CPP_NAMESPACE_BEGIN
 DatatypeValidator::DatatypeValidator(DatatypeValidator* const baseValidator,
                                      RefHashTableOf<KVStringPair>* const facets,
                                      const int finalSet,
-                                     const ValidatorType type)
-    : fFinalSet(finalSet)
+                                     const ValidatorType type,
+                                     MemoryManager* const manager)
+    : fMemoryManager(manager)
+    , fAnonymous(false)
+    , fFinalSet(finalSet)
     , fFacetsDefined(0)
     , fFixed(0)
     , fType(type)
@@ -117,10 +124,9 @@ DatatypeValidator::DatatypeValidator(DatatypeValidator* const baseValidator,
     , fFacets(facets)
     , fPattern(0)
     , fRegex(0)
-    , fTypeLocalName(0)
+    , fTypeLocalName(XMLUni::fgZeroLenString)
     , fTypeName(0)
-    , fTypeUri(0) 
-    , fAnonymous(false)
+    , fTypeUri(XMLUni::fgZeroLenString)
 {
 }
 
@@ -145,6 +151,91 @@ const XMLCh* DatatypeValidator::getWSstring(const short theType) const
 
 }
 
+void DatatypeValidator::setTypeName(const XMLCh* const name, const XMLCh* const uri)
+{
+    if (fTypeName) {
+
+        fMemoryManager->deallocate(fTypeName);
+        fTypeName = 0;
+    }
+
+    if (name || uri) {
+
+        unsigned int nameLen = XMLString::stringLen(name);
+        unsigned int uriLen = XMLString::stringLen(uri);
+
+        fTypeName = (XMLCh*) fMemoryManager->allocate
+        (
+            (nameLen + uriLen + 2)*sizeof(XMLCh)
+        );
+        fTypeUri = fTypeName;
+        fTypeLocalName = &fTypeName[uriLen+1];
+
+        if (uri)
+			XMLString::moveChars(fTypeName, uri, uriLen+1);
+        else
+			fTypeName[0] = chNull;
+
+        if (name)
+            XMLString::moveChars(&fTypeName[uriLen+1], name, nameLen+1);
+        else
+            fTypeName[uriLen+1] = chNull;
+    }
+    else
+    {
+        fTypeUri = fTypeLocalName = XMLUni::fgZeroLenString;
+    }
+}
+
+void DatatypeValidator::setTypeName(const XMLCh* const typeName)
+{
+    if (fTypeName)
+    {
+        fMemoryManager->deallocate(fTypeName);
+        fTypeName = 0;
+    }
+
+    if (typeName)
+    {
+        unsigned int nameLen = XMLString::stringLen(typeName);
+        int commaOffset = XMLString::indexOf(typeName, chComma);
+
+        fTypeName = (XMLCh*) fMemoryManager->allocate
+        (
+            (nameLen + 1) * sizeof(XMLCh)
+        );
+	    XMLString::moveChars(fTypeName, typeName, nameLen+1);
+
+        if ( commaOffset == -1) {
+            fTypeUri = SchemaSymbols::fgURI_SCHEMAFORSCHEMA;
+            fTypeLocalName = fTypeName;
+        }
+        else {
+            fTypeUri = fTypeName;
+            fTypeLocalName = &fTypeName[commaOffset+1];
+            fTypeName[commaOffset] = chNull;
+        }
+    }
+    else
+    {
+        fTypeUri = fTypeLocalName = XMLUni::fgZeroLenString;
+    }
+}
+
+// ---------------------------------------------------------------------------
+//  DatatypeValidator: CleanUp methods
+// ---------------------------------------------------------------------------
+void DatatypeValidator::cleanUp() {
+
+	delete fFacets;
+    delete fRegex;
+    if (fPattern)
+        fMemoryManager->deallocate(fPattern);//delete [] fPattern;
+    if (fTypeName)
+        fMemoryManager->deallocate(fTypeName);
+}
+
+
 XERCES_CPP_NAMESPACE_END
 
 /**
diff --git a/src/xercesc/validators/datatype/DatatypeValidator.hpp b/src/xercesc/validators/datatype/DatatypeValidator.hpp
index d496db8a5..de24de16b 100644
--- a/src/xercesc/validators/datatype/DatatypeValidator.hpp
+++ b/src/xercesc/validators/datatype/DatatypeValidator.hpp
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 2001 The Apache Software Foundation.  All rights
+ * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -61,14 +61,18 @@
 #if !defined(DATATYPEVALIDATOR_HPP)
 #define DATATYPEVALIDATOR_HPP
 
+#include <xercesc/util/PlatformUtils.hpp>
 #include <xercesc/util/RefHashTableOf.hpp>
 #include <xercesc/util/KVStringPair.hpp>
+#include <xercesc/util/XMLUniDefs.hpp>
 #include <xercesc/util/regx/RegularExpression.hpp>
 #include <xercesc/validators/schema/SchemaSymbols.hpp>
-#include <xercesc/framework/XMLBuffer.hpp>
+
 
 XERCES_CPP_NAMESPACE_BEGIN
 
+class MemoryManager;
+
 /**
   * DataTypeValidator defines the interface that data type validators must
   * obey. These validators can be supplied by the application writer and may
@@ -85,7 +89,7 @@ XERCES_CPP_NAMESPACE_BEGIN
   */
 
 
-class VALIDATORS_EXPORT DatatypeValidator
+class VALIDATORS_EXPORT DatatypeValidator : public XMemory
 {
 public:
     // -----------------------------------------------------------------------
@@ -269,9 +273,13 @@ public:
       * Returns an instance of the base datatype validator class
 	  * Used by the DatatypeValidatorFactory.
       */
-	virtual DatatypeValidator* newInstance(RefHashTableOf<KVStringPair>* const,
-                                           RefArrayVectorOf<XMLCh>* const enums,
-                                           const int finalSet) = 0;
+	virtual DatatypeValidator* newInstance
+    (
+        RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    ) = 0;
 
     /**
      * Returns the uri,name of the type this validator is for
@@ -300,6 +308,10 @@ public:
      */
     const XMLCh* getTypeLocalName() const;
 
+    /**
+     * Returns the plugged-in memory manager
+     */
+    MemoryManager* getMemoryManager() const;
 
 protected:
     // -----------------------------------------------------------------------
@@ -321,7 +333,8 @@ protected:
 	DatatypeValidator(DatatypeValidator* const baseValidator,
                       RefHashTableOf<KVStringPair>* const facets,
                       const int finalSet,
-                      const ValidatorType type);
+                      const ValidatorType type,
+                      MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
 
     //@}
 
@@ -363,6 +376,14 @@ protected:
       */
     const XMLCh*   getWSstring(const short WSType) const;
 
+    // -----------------------------------------------------------------------
+    //  Protected data members
+    //
+    //  fMemoryManager
+    //      Pluggable memory manager for dynamic allocation/deallocation.
+    // -----------------------------------------------------------------------
+    MemoryManager*                fMemoryManager;
+
 private:
     // -----------------------------------------------------------------------
     //  CleanUp methods
@@ -413,6 +434,7 @@ private:
     //      true if this type is anonynous
     //
     // -----------------------------------------------------------------------
+    bool                          fAnonymous;
     int                           fFinalSet;
     int                           fFacetsDefined;
     int                           fFixed;
@@ -421,10 +443,9 @@ private:
 	RefHashTableOf<KVStringPair>* fFacets;
     XMLCh*                        fPattern;
     RegularExpression*            fRegex;
-    XMLCh*                        fTypeLocalName;
     XMLCh*                        fTypeName;
-    XMLCh*                        fTypeUri;
-    bool                          fAnonymous;
+    const XMLCh*                  fTypeLocalName;
+    const XMLCh*                  fTypeUri;
 };
 
 
@@ -456,88 +477,74 @@ inline DatatypeValidator::ValidatorType DatatypeValidator::getType() const
     return fType;
 }
 
-inline void DatatypeValidator::setType(ValidatorType theType)
+inline int DatatypeValidator::getFacetsDefined() const
 {
-    fType = theType;
+    return fFacetsDefined;
 }
 
-// ---------------------------------------------------------------------------
-//  DatatypeValidator: CleanUp methods
-// ---------------------------------------------------------------------------
-inline void DatatypeValidator::cleanUp() {
-
-	delete fFacets;
-    delete [] fPattern;
-    delete fRegex;
-    delete [] fTypeName;
-    delete [] fTypeLocalName;
-    delete [] fTypeUri;
+inline int DatatypeValidator::getFixed() const
+{
+    return fFixed;
 }
 
-
-// ---------------------------------------------------------------------------
-//  DatatypeValidators: Compare methods
-// ---------------------------------------------------------------------------
-inline int DatatypeValidator::compare(const XMLCh* const lValue,
-                                      const XMLCh* const rValue)
+inline const XMLCh* DatatypeValidator::getPattern() const
 {
-    return XMLString::compareString(lValue, rValue);
+    return fPattern;
 }
 
-// ---------------------------------------------------------------------------
-//  DatatypeValidators: Validation methods
-// ---------------------------------------------------------------------------
-inline bool
-DatatypeValidator::isSubstitutableBy(const DatatypeValidator* const toCheck)
+inline RegularExpression* DatatypeValidator::getRegex() const
 {
-    const DatatypeValidator* dv = toCheck;
-
-	while (dv != 0) {
-
-        if (dv == this) {
-            return true;
-        }
+    return fRegex;
+}
 
-        dv = dv->getBaseValidator();
-    }
+inline const XMLCh* DatatypeValidator::getTypeName() const
+{
+    return fTypeLocalName;
+}
 
-    return false;
+inline bool DatatypeValidator::getAnonymous() const
+{
+    return fAnonymous;
 }
 
-inline int DatatypeValidator::getFacetsDefined() const
+inline const XMLCh* DatatypeValidator::getTypeLocalName() const
 {
-    return fFacetsDefined;
+    return fTypeLocalName;
 }
 
-inline void DatatypeValidator::setFacetsDefined(int facets)
+inline const XMLCh* DatatypeValidator::getTypeUri() const
 {
-    fFacetsDefined |= facets;
+    return fTypeUri;
 }
 
-inline int DatatypeValidator::getFixed() const
+inline MemoryManager* DatatypeValidator::getMemoryManager() const
 {
-    return fFixed;
+    return fMemoryManager;
 }
 
-inline void DatatypeValidator::setFixed(int fixed)
+// ---------------------------------------------------------------------------
+//  DatatypeValidator: Setters
+// ---------------------------------------------------------------------------
+inline void DatatypeValidator::setType(ValidatorType theType)
 {
-    fFixed |= fixed;
+    fType = theType;
 }
 
-inline const XMLCh* DatatypeValidator::getPattern() const
+inline void DatatypeValidator::setFacetsDefined(int facets)
 {
-    return fPattern;
+    fFacetsDefined |= facets;
 }
 
-inline void DatatypeValidator::setPattern(const XMLCh* pattern)
+inline void DatatypeValidator::setFixed(int fixed)
 {
-    delete [] fPattern;
-    fPattern = XMLString::replicate(pattern);
+    fFixed |= fixed;
 }
 
-inline RegularExpression* DatatypeValidator::getRegex() const
+inline void DatatypeValidator::setPattern(const XMLCh* pattern)
 {
-    return fRegex;
+    if (fPattern)
+        fMemoryManager->deallocate(fPattern);//delete [] fPattern;
+    fPattern = XMLString::replicate(pattern, fMemoryManager);
 }
 
 inline void DatatypeValidator::setRegex(RegularExpression* const regex)
@@ -550,75 +557,37 @@ inline bool DatatypeValidator::isAtomic() const {
     return true;
 }
 
-inline const XMLCh* DatatypeValidator::getTypeName() const {
-    return fTypeName;
-}
-
-inline const XMLCh* DatatypeValidator::getTypeLocalName() const {
-    if(!fTypeLocalName) {
-        int index = XMLString::indexOf(fTypeName, chComma);
-        int length = XMLString::stringLen(fTypeName);
-        XMLCh *tName = new XMLCh[length - index + 1];
-        XMLString::subString(tName, fTypeName, index + 1, length);
-        ((DatatypeValidator *)this)->fTypeLocalName = tName;
-    }
-
-    return fTypeLocalName;
+inline void DatatypeValidator::setAnonymous() {
+    fAnonymous = true;
 }
 
-inline const XMLCh* DatatypeValidator::getTypeUri() const {
-    if(!fTypeUri) {
-        int index = XMLString::indexOf(fTypeName, chComma);
-        XMLCh *uri = new XMLCh[index + 1];
-        XMLString::subString(uri, fTypeName, 0, index);
-        ((DatatypeValidator *)this)->fTypeUri = uri;
-    }
-
-    return fTypeUri;
+// ---------------------------------------------------------------------------
+//  DatatypeValidators: Compare methods
+// ---------------------------------------------------------------------------
+inline int DatatypeValidator::compare(const XMLCh* const lValue,
+                                      const XMLCh* const rValue)
+{
+    return XMLString::compareString(lValue, rValue);
 }
 
-inline void DatatypeValidator::setTypeName(const XMLCh* const name, const XMLCh* const uri) {
+// ---------------------------------------------------------------------------
+//  DatatypeValidators: Validation methods
+// ---------------------------------------------------------------------------
+inline bool
+DatatypeValidator::isSubstitutableBy(const DatatypeValidator* const toCheck)
+{
+    const DatatypeValidator* dv = toCheck;
 
-    delete [] fTypeName;
-    delete [] fTypeLocalName;
-    delete [] fTypeUri;
+	while (dv != 0) {
 
-    fTypeUri = XMLString::replicate(uri);
-    fTypeLocalName = XMLString::replicate(name);
-    XMLBuffer buf;
-    buf.set(uri);
-    buf.append(chComma);
-    buf.append(name);
-    fTypeName = XMLString::replicate(buf.getRawBuffer());
-}
+        if (dv == this) {
+            return true;
+        }
 
-inline void DatatypeValidator::setTypeName(const XMLCh* const typeName) {
-
-    delete [] fTypeName;
-    delete [] fTypeLocalName;
-    fTypeLocalName = 0;
-    delete [] fTypeUri;
-    fTypeUri = 0;
-
-    //REVISIT this is a lot of work, cant we set this earlier when we have the info?
-    if( XMLString::indexOf( typeName, chComma ) < 0 ) {
-        XMLBuffer buf;
-        buf.set(SchemaSymbols::fgURI_SCHEMAFORSCHEMA);
-        buf.append(chComma);
-        buf.append(typeName);
-        fTypeName = XMLString::replicate(buf.getRawBuffer());
-    }
-    else {
-        fTypeName = XMLString::replicate(typeName);
+        dv = dv->getBaseValidator();
     }
-}
 
-inline void DatatypeValidator::setAnonymous() {
-    fAnonymous = true;
-}
-
-inline bool DatatypeValidator::getAnonymous() const {
-    return fAnonymous;
+    return false;
 }
 
 
diff --git a/src/xercesc/validators/datatype/DatatypeValidatorFactory.cpp b/src/xercesc/validators/datatype/DatatypeValidatorFactory.cpp
index 2039ad94b..fc274a959 100644
--- a/src/xercesc/validators/datatype/DatatypeValidatorFactory.cpp
+++ b/src/xercesc/validators/datatype/DatatypeValidatorFactory.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.14  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.13  2003/03/18 19:42:17  knoaman
  * Schema Errata E2-18.
  *
@@ -383,8 +386,9 @@ RefHashTableOf<DatatypeValidator>* DatatypeValidatorFactory::fBuiltInRegistry =
 // ---------------------------------------------------------------------------
 //  DatatypeValidatorFactory: Constructors and Destructor
 // ---------------------------------------------------------------------------
-DatatypeValidatorFactory::DatatypeValidatorFactory()
+DatatypeValidatorFactory::DatatypeValidatorFactory(MemoryManager* const manager)
     : fUserDefinedRegistry(0)
+    , fMemoryManager(manager)
 {
 }
 
@@ -718,29 +722,43 @@ void DatatypeValidatorFactory::expandRegistryToFullSchemaSet()
     // So instead of storing them in the static fBuiltInRegistry,
     //   store them in local data fUserDefinedRegistry
     if (fUserDefinedRegistry == 0)
-        fUserDefinedRegistry = new RefHashTableOf<DatatypeValidator>(29);
+        fUserDefinedRegistry = new (fMemoryManager) RefHashTableOf<DatatypeValidator>(29);
 
     if (!getDatatypeValidator(XMLUni::fgIDRefsString)) {
 
-        DatatypeValidator *dv = new IDDatatypeValidator(getDatatypeValidator(SchemaSymbols::fgDT_NCNAME), 0, 0, 0);
+        DatatypeValidator *dv = new (fMemoryManager) IDDatatypeValidator(getDatatypeValidator(SchemaSymbols::fgDT_NCNAME), 0, 0, 0);
         dv->setTypeName(XMLUni::fgIDString, SchemaSymbols::fgURI_SCHEMAFORSCHEMA);
         fUserDefinedRegistry->put((void*) XMLUni::fgIDString, dv);
 
-        dv = new IDREFDatatypeValidator(getDatatypeValidator(SchemaSymbols::fgDT_NCNAME), 0, 0, 0);
+        dv = new (fMemoryManager) IDREFDatatypeValidator(getDatatypeValidator(SchemaSymbols::fgDT_NCNAME), 0, 0, 0);
         dv->setTypeName(XMLUni::fgIDRefString, SchemaSymbols::fgURI_SCHEMAFORSCHEMA);
         fUserDefinedRegistry->put((void*) XMLUni::fgIDRefString, dv);
 
-        dv = new ENTITYDatatypeValidator(getDatatypeValidator(SchemaSymbols::fgDT_NCNAME), 0, 0, 0);
+        dv = new (fMemoryManager) ENTITYDatatypeValidator(getDatatypeValidator(SchemaSymbols::fgDT_NCNAME), 0, 0, 0);
         dv->setTypeName(XMLUni::fgEntityString, SchemaSymbols::fgURI_SCHEMAFORSCHEMA);
         fUserDefinedRegistry->put((void*) XMLUni::fgEntityString, dv);
 
         // Create 'IDREFS' datatype validator
-    	createDatatypeValidator(XMLUni::fgIDRefsString,
-                        getDatatypeValidator(XMLUni::fgIDRefString), 0, 0, true, 0, true);
+    	createDatatypeValidator
+        (
+            XMLUni::fgIDRefsString
+            , getDatatypeValidator(XMLUni::fgIDRefString)
+            , 0
+            , 0
+            , true
+            , 0
+        );
 
         // Create 'ENTITIES' datatype validator
-        createDatatypeValidator(XMLUni::fgEntitiesString,
-    		            getDatatypeValidator(XMLUni::fgEntityString), 0, 0, true, 0, true);
+        createDatatypeValidator
+        (
+            XMLUni::fgEntitiesString
+    		, getDatatypeValidator(XMLUni::fgEntityString)
+            , 0
+            , 0
+            , true
+            , 0
+        );
     }
 
 }
@@ -748,14 +766,16 @@ void DatatypeValidatorFactory::expandRegistryToFullSchemaSet()
 // ---------------------------------------------------------------------------
 //  DatatypeValidatorFactory: factory methods
 // ---------------------------------------------------------------------------
-DatatypeValidator*
-DatatypeValidatorFactory::createDatatypeValidator(const XMLCh* const typeName,
-		                                          DatatypeValidator* const baseValidator,
-                                                  RefHashTableOf<KVStringPair>* const facets,
-                                                  RefArrayVectorOf<XMLCh>* const enums,
-                                                  const bool derivedByList,
-                                                  const int finalSet,
-                                                  const bool userDefined)
+DatatypeValidator* DatatypeValidatorFactory::createDatatypeValidator
+(
+      const XMLCh* const                  typeName
+	, DatatypeValidator* const            baseValidator
+    , RefHashTableOf<KVStringPair>* const facets
+    , RefArrayVectorOf<XMLCh>* const      enums
+    , const bool                          isDerivedByList
+    , const int                           finalSet
+    , const bool                          isUserDefined
+)
 {
 	if (baseValidator == 0) {
 
@@ -771,9 +791,11 @@ DatatypeValidatorFactory::createDatatypeValidator(const XMLCh* const typeName,
     }
 
 	DatatypeValidator* datatypeValidator = 0;
+    MemoryManager* const manager = (isUserDefined)
+        ? fMemoryManager : XMLPlatformUtils::fgMemoryManager;
 
-    if (derivedByList) {
-        datatypeValidator = new ListDatatypeValidator(baseValidator, facets, enums, finalSet);
+    if (isDerivedByList) {
+        datatypeValidator = new (manager) ListDatatypeValidator(baseValidator, facets, enums, finalSet);
     }
     else {
 
@@ -786,15 +808,21 @@ DatatypeValidatorFactory::createDatatypeValidator(const XMLCh* const typeName,
             }
         }
 
-        datatypeValidator = baseValidator->newInstance(facets, enums, finalSet);
+        datatypeValidator = baseValidator->newInstance
+        (
+            facets
+            , enums
+            , finalSet
+            , manager
+        );
     }
 
     if (datatypeValidator != 0) {
 
-        if (userDefined) {
+        if (isUserDefined) {
 
             if (!fUserDefinedRegistry) {
-                fUserDefinedRegistry = new RefHashTableOf<DatatypeValidator>(29);
+                fUserDefinedRegistry = new (fMemoryManager) RefHashTableOf<DatatypeValidator>(29);
             }
 
             fUserDefinedRegistry->put((void *)typeName, datatypeValidator);
@@ -802,6 +830,7 @@ DatatypeValidatorFactory::createDatatypeValidator(const XMLCh* const typeName,
         else {
             fBuiltInRegistry->put((void *)typeName, datatypeValidator);
         }
+
         datatypeValidator->setTypeName(typeName);
     }
 
@@ -809,25 +838,29 @@ DatatypeValidatorFactory::createDatatypeValidator(const XMLCh* const typeName,
 }
 
 
-DatatypeValidator*
-DatatypeValidatorFactory::createDatatypeValidator(const XMLCh* const typeName,
-                                                  RefVectorOf<DatatypeValidator>* const validators,
-                                                  const int finalSet,
-                                                  const bool userDefined)
+DatatypeValidator* DatatypeValidatorFactory::createDatatypeValidator
+(
+      const XMLCh* const                    typeName
+    , RefVectorOf<DatatypeValidator>* const validators
+    , const int                             finalSet
+    , const bool                            userDefined
+)
 {
     if (validators == 0)
         return 0;
 
     DatatypeValidator* datatypeValidator = 0;
+    MemoryManager* const manager = (userDefined)
+        ? fMemoryManager : XMLPlatformUtils::fgMemoryManager;
 
-    datatypeValidator = new UnionDatatypeValidator(validators, finalSet);
+    datatypeValidator = new (manager) UnionDatatypeValidator(validators, finalSet);
 
     if (datatypeValidator != 0) {
 
         if (userDefined) {
 
             if (!fUserDefinedRegistry) {
-                fUserDefinedRegistry = new RefHashTableOf<DatatypeValidator>(29);
+                fUserDefinedRegistry = new (fMemoryManager) RefHashTableOf<DatatypeValidator>(29);
             }
 
             fUserDefinedRegistry->put((void *)typeName, datatypeValidator);
diff --git a/src/xercesc/validators/datatype/DatatypeValidatorFactory.hpp b/src/xercesc/validators/datatype/DatatypeValidatorFactory.hpp
index 989df51bf..b69916e54 100644
--- a/src/xercesc/validators/datatype/DatatypeValidatorFactory.hpp
+++ b/src/xercesc/validators/datatype/DatatypeValidatorFactory.hpp
@@ -97,7 +97,7 @@ typedef RefHashTableOf<DatatypeValidator> DVHashTable;
 typedef RefArrayVectorOf<XMLCh> XMLChRefVector;
 
 
-class VALIDATORS_EXPORT DatatypeValidatorFactory
+class VALIDATORS_EXPORT DatatypeValidatorFactory : public XMemory
 {
 public:
 
@@ -107,7 +107,10 @@ public:
     /** @name Constructors */
     //@{
 
-    DatatypeValidatorFactory();
+    DatatypeValidatorFactory
+    (
+        MemoryManager* const manager// = XMLPlatformUtils::fgMemoryManager
+    );
 
     //@}
 
@@ -174,40 +177,53 @@ public:
      * Creates a new datatype validator of type baseValidator's class and
      * adds it to the registry
      *
-     * @param  typeName       Datatype validator name
+     * @param  typeName        Datatype validator name
      *
-     * @param  baseValidator  Base datatype validator
+     * @param  baseValidator   Base datatype validator
      *
-     * @param  facets         datatype facets if any
+     * @param  facets          datatype facets if any
      *
-     * @param  enums          vector of values for enum facet
+     * @param  enums           vector of values for enum facet
      *
-     * @param  derivedByList  Indicates whether the datatype is derived by
-     *                        list or not
+     * @param  isDerivedByList Indicates whether the datatype is derived by
+     *                         list or not
      *
      * @param  finalSet       'final' values of the simpleType
+     *
+     * @param  isUserDefined  Indicates whether the datatype is built-in or
+     *                        user defined
      */
-     DatatypeValidator* createDatatypeValidator(const XMLCh* const,
-                                               DatatypeValidator* const,
-                                               RefHashTableOf<KVStringPair>* const,
-                                               RefArrayVectorOf<XMLCh>* const enums,
-                                               const bool,
-                                               const int = 0,
-                                               const bool = true);
+    DatatypeValidator* createDatatypeValidator
+    (
+        const XMLCh* const                    typeName
+        , DatatypeValidator* const            baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const      enums
+        , const bool                          isDerivedByList
+        , const int                           finalSet = 0
+        , const bool                          isUserDefined = true
+    );
 
     /**
-      * Creates a new datatype validator of type UnionDatatypeValidator and
-      * adds it to the registry
-      *
-      * @param  typeName       Datatype validator name
-      *
-      * @param  validators     Vector of datatype validators
-      *
-      */
-    DatatypeValidator* createDatatypeValidator(const XMLCh* const,
-                                               RefVectorOf<DatatypeValidator>* const,
-                                               const int finalSet,
-                                               const bool = true);
+     * Creates a new datatype validator of type UnionDatatypeValidator and
+     * adds it to the registry
+     *
+     * @param  typeName       Datatype validator name
+     *
+     * @param  validators     Vector of datatype validators
+     *
+     * @param  finalSet       'final' values of the simpleType
+     *
+     * @param  isUserDefined  Indicates whether the datatype is built-in or
+     *                        user defined
+     */
+    DatatypeValidator* createDatatypeValidator
+    (
+          const XMLCh* const                    typeName
+        , RefVectorOf<DatatypeValidator>* const validators
+        , const int                             finalSet
+        , const bool                            isUserDefined = true
+    );
 
     //@}
 
@@ -238,6 +254,7 @@ private:
     // -----------------------------------------------------------------------
     XERCES_CPP_NAMESPACE_QUALIFIER RefHashTableOf<XERCES_CPP_NAMESPACE_QUALIFIER DatatypeValidator>*        fUserDefinedRegistry;
     static XERCES_CPP_NAMESPACE_QUALIFIER RefHashTableOf<DatatypeValidator>* fBuiltInRegistry;
+    XERCES_CPP_NAMESPACE_QUALIFIER MemoryManager* const fMemoryManager;
 
     friend class XPath2ContextImpl;
 };
diff --git a/src/xercesc/validators/datatype/DateDatatypeValidator.cpp b/src/xercesc/validators/datatype/DateDatatypeValidator.cpp
index 69ce0eea5..1fb7d367a 100644
--- a/src/xercesc/validators/datatype/DateDatatypeValidator.cpp
+++ b/src/xercesc/validators/datatype/DateDatatypeValidator.cpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -87,16 +90,17 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  Constructors and Destructor
 // ---------------------------------------------------------------------------
-DateDatatypeValidator::DateDatatypeValidator()
-:DateTimeValidator(0, 0, 0, DatatypeValidator::Date)
+DateDatatypeValidator::DateDatatypeValidator(MemoryManager* const manager)
+:DateTimeValidator(0, 0, 0, DatatypeValidator::Date, manager)
 {}
 
 DateDatatypeValidator::DateDatatypeValidator(
                           DatatypeValidator*            const baseValidator
                         , RefHashTableOf<KVStringPair>* const facets
-                        , RefArrayVectorOf<XMLCh>*           const enums
-                        , const int                           finalSet)
-:DateTimeValidator(baseValidator, facets, finalSet, DatatypeValidator::Date)
+                        , RefArrayVectorOf<XMLCh>*      const enums
+                        , const int                           finalSet
+                        , MemoryManager* const                 manager)
+:DateTimeValidator(baseValidator, facets, finalSet, DatatypeValidator::Date, manager)
 {
     init(enums);
 }
@@ -104,12 +108,15 @@ DateDatatypeValidator::DateDatatypeValidator(
 DateDatatypeValidator::~DateDatatypeValidator()
 {}
 
-DatatypeValidator* DateDatatypeValidator::newInstance(
-                                      RefHashTableOf<KVStringPair>* const facets
-                                    , RefArrayVectorOf<XMLCh>*           const enums
-                                    , const int                           finalSet)
+DatatypeValidator* DateDatatypeValidator::newInstance
+(
+      RefHashTableOf<KVStringPair>* const facets
+    , RefArrayVectorOf<XMLCh>* const      enums
+    , const int                           finalSet
+    , MemoryManager* const                manager
+)
 {
-    return (DatatypeValidator*) new DateDatatypeValidator(this, facets, enums, finalSet);
+    return (DatatypeValidator*) new (manager) DateDatatypeValidator(this, facets, enums, finalSet, manager);
 }
 
 //
@@ -117,7 +124,7 @@ DatatypeValidator* DateDatatypeValidator::newInstance(
 //
 XMLDateTime* DateDatatypeValidator::parse(const XMLCh* const content)
 {
-    XMLDateTime *pRetDate = new XMLDateTime(content);
+    XMLDateTime *pRetDate = new (fMemoryManager) XMLDateTime(content);
 
     try
     {
diff --git a/src/xercesc/validators/datatype/DateDatatypeValidator.hpp b/src/xercesc/validators/datatype/DateDatatypeValidator.hpp
index 6522c2de7..e1c71ea52 100644
--- a/src/xercesc/validators/datatype/DateDatatypeValidator.hpp
+++ b/src/xercesc/validators/datatype/DateDatatypeValidator.hpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -85,28 +88,36 @@ public:
     // -----------------------------------------------------------------------
     //  Public ctor/dtor
     // -----------------------------------------------------------------------
-	/** @name Constructor. */
+	/** @name Constructors and Destructor */
     //@{
 
-    DateDatatypeValidator();
-
-    DateDatatypeValidator(DatatypeValidator*            const baseValidator
-                        , RefHashTableOf<KVStringPair>* const facets
-                        , RefArrayVectorOf<XMLCh>*           const enums
-                        , const int                           finalSet);
-
+    DateDatatypeValidator
+    (
+        MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
+    DateDatatypeValidator
+    (
+        DatatypeValidator* const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
     ~DateDatatypeValidator();
 
-
 	//@}
 
     /**
       * Returns an instance of the base datatype validator class
 	  * Used by the DatatypeValidatorFactory.
       */
-    virtual DatatypeValidator* newInstance(RefHashTableOf<KVStringPair>* const facets
-                                         , RefArrayVectorOf<XMLCh>*           const enums
-                                         , const int                           finalSet);
+    virtual DatatypeValidator* newInstance
+    (
+        RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
 protected:
 
diff --git a/src/xercesc/validators/datatype/DateTimeDatatypeValidator.cpp b/src/xercesc/validators/datatype/DateTimeDatatypeValidator.cpp
index 0f519f8f3..851139108 100644
--- a/src/xercesc/validators/datatype/DateTimeDatatypeValidator.cpp
+++ b/src/xercesc/validators/datatype/DateTimeDatatypeValidator.cpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -87,16 +90,17 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  Constructors and Destructor
 // ---------------------------------------------------------------------------
-DateTimeDatatypeValidator::DateTimeDatatypeValidator()
-:DateTimeValidator(0, 0, 0, DatatypeValidator::DateTime)
+DateTimeDatatypeValidator::DateTimeDatatypeValidator(MemoryManager* const manager)
+:DateTimeValidator(0, 0, 0, DatatypeValidator::DateTime, manager)
 {}
 
 DateTimeDatatypeValidator::DateTimeDatatypeValidator(
                           DatatypeValidator*            const baseValidator
                         , RefHashTableOf<KVStringPair>* const facets
-                        , RefArrayVectorOf<XMLCh>*           const enums
-                        , const int                           finalSet)
-:DateTimeValidator(baseValidator, facets, finalSet, DatatypeValidator::DateTime)
+                        , RefArrayVectorOf<XMLCh>*      const enums
+                        , const int                           finalSet
+                        , MemoryManager* const                manager)
+:DateTimeValidator(baseValidator, facets, finalSet, DatatypeValidator::DateTime, manager)
 {
     init(enums);
 }
@@ -104,12 +108,15 @@ DateTimeDatatypeValidator::DateTimeDatatypeValidator(
 DateTimeDatatypeValidator::~DateTimeDatatypeValidator()
 {}
 
-DatatypeValidator* DateTimeDatatypeValidator::newInstance(
-                                      RefHashTableOf<KVStringPair>* const facets
-                                    , RefArrayVectorOf<XMLCh>*           const enums
-                                    , const int                           finalSet)
+DatatypeValidator* DateTimeDatatypeValidator::newInstance
+(
+      RefHashTableOf<KVStringPair>* const facets
+    , RefArrayVectorOf<XMLCh>* const      enums
+    , const int                           finalSet
+    , MemoryManager* const                manager
+)
 {
-    return (DatatypeValidator*) new DateTimeDatatypeValidator(this, facets, enums, finalSet);
+    return (DatatypeValidator*) new (manager) DateTimeDatatypeValidator(this, facets, enums, finalSet, manager);
 }
 
 //
@@ -117,7 +124,7 @@ DatatypeValidator* DateTimeDatatypeValidator::newInstance(
 //
 XMLDateTime* DateTimeDatatypeValidator::parse(const XMLCh* const content)
 {
-    XMLDateTime *pRetDate = new XMLDateTime(content);
+    XMLDateTime *pRetDate = new (fMemoryManager) XMLDateTime(content);
 
     try
     {
diff --git a/src/xercesc/validators/datatype/DateTimeDatatypeValidator.hpp b/src/xercesc/validators/datatype/DateTimeDatatypeValidator.hpp
index e12473b15..b2a602045 100644
--- a/src/xercesc/validators/datatype/DateTimeDatatypeValidator.hpp
+++ b/src/xercesc/validators/datatype/DateTimeDatatypeValidator.hpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -85,28 +88,36 @@ public:
     // -----------------------------------------------------------------------
     //  Public ctor/dtor
     // -----------------------------------------------------------------------
-	/** @name Constructor. */
+	/** @name Constructors and Destructor */
     //@{
 
-    DateTimeDatatypeValidator();
-
-    DateTimeDatatypeValidator(DatatypeValidator*            const baseValidator
-                            , RefHashTableOf<KVStringPair>* const facets
-                            , RefArrayVectorOf<XMLCh>*           const enums
-                            , const int                           finalSet);
-
+    DateTimeDatatypeValidator
+    (
+        MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
+    DateTimeDatatypeValidator
+    (
+        DatatypeValidator* const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
     ~DateTimeDatatypeValidator();
 
-
 	//@}
 
     /**
       * Returns an instance of the base datatype validator class
 	  * Used by the DatatypeValidatorFactory.
       */
-    virtual DatatypeValidator* newInstance(RefHashTableOf<KVStringPair>* const facets
-                                         , RefArrayVectorOf<XMLCh>*           const enums
-                                         , const int                           finalSet);
+    virtual DatatypeValidator* newInstance
+    (
+        RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
 protected:
 
diff --git a/src/xercesc/validators/datatype/DateTimeValidator.cpp b/src/xercesc/validators/datatype/DateTimeValidator.cpp
index 4cb2faeb0..0994dae09 100644
--- a/src/xercesc/validators/datatype/DateTimeValidator.cpp
+++ b/src/xercesc/validators/datatype/DateTimeValidator.cpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.5  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.4  2003/01/30 21:56:22  tng
  * Performance: call getRawData instead of toString
  *
@@ -111,8 +114,9 @@ DateTimeValidator::DateTimeValidator(
                           DatatypeValidator*            const baseValidator
                         , RefHashTableOf<KVStringPair>* const facets
                         , const int                           finalSet
-                        , const ValidatorType                 type)
-:AbstractNumericFacetValidator(baseValidator, facets, finalSet, type)
+                        , const ValidatorType                 type
+                        , MemoryManager* const                manager)
+:AbstractNumericFacetValidator(baseValidator, facets, finalSet, type, manager)
 {
     //do not invoke init() here !!!
 }
@@ -175,7 +179,7 @@ void DateTimeValidator::checkContent(const XMLCh* const content
         // lazy construction
         if (getRegex() ==0) {
             try {
-                setRegex(new RegularExpression(getPattern(), SchemaSymbols::fgRegEx_XOption));
+                setRegex(new (fMemoryManager) RegularExpression(getPattern(), SchemaSymbols::fgRegEx_XOption));
             }
             catch (XMLException &e)
             {
@@ -341,7 +345,7 @@ void DateTimeValidator::setEnumeration()
         return;
 
     int enumLength = fStrEnumeration->size();
-    fEnumeration = new RefVectorOf<XMLNumber>(enumLength, true);
+    fEnumeration = new (fMemoryManager) RefVectorOf<XMLNumber>(enumLength, true);
     fEnumerationInherited = false;
 
     for ( int i = 0; i < enumLength; i++)
diff --git a/src/xercesc/validators/datatype/DateTimeValidator.hpp b/src/xercesc/validators/datatype/DateTimeValidator.hpp
index 27c55792c..7d4bfe266 100644
--- a/src/xercesc/validators/datatype/DateTimeValidator.hpp
+++ b/src/xercesc/validators/datatype/DateTimeValidator.hpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.3  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.2  2002/11/04 14:53:28  tng
  * C++ Namespace Support.
  *
@@ -103,10 +106,14 @@ protected:
     // -----------------------------------------------------------------------
     //  ctor used by derived class
     // -----------------------------------------------------------------------
-    DateTimeValidator(DatatypeValidator*            const baseValidator
-                    , RefHashTableOf<KVStringPair>* const facets
-                    , const int                           finalSet
-                    , const ValidatorType                 type);
+    DateTimeValidator
+    (
+        DatatypeValidator* const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , const int finalSet
+        , const ValidatorType type
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
     //
     // Abstract interface
diff --git a/src/xercesc/validators/datatype/DayDatatypeValidator.cpp b/src/xercesc/validators/datatype/DayDatatypeValidator.cpp
index f93d11ef6..bc3c467f4 100644
--- a/src/xercesc/validators/datatype/DayDatatypeValidator.cpp
+++ b/src/xercesc/validators/datatype/DayDatatypeValidator.cpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -87,16 +90,17 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  Constructors and Destructor
 // ---------------------------------------------------------------------------
-DayDatatypeValidator::DayDatatypeValidator()
-:DateTimeValidator(0, 0, 0, DatatypeValidator::Day)
+DayDatatypeValidator::DayDatatypeValidator(MemoryManager* const manager)
+:DateTimeValidator(0, 0, 0, DatatypeValidator::Day, manager)
 {}
 
 DayDatatypeValidator::DayDatatypeValidator(
                           DatatypeValidator*            const baseValidator
                         , RefHashTableOf<KVStringPair>* const facets
-                        , RefArrayVectorOf<XMLCh>*           const enums
-                        , const int                           finalSet)
-:DateTimeValidator(baseValidator, facets, finalSet, DatatypeValidator::Day)
+                        , RefArrayVectorOf<XMLCh>*      const enums
+                        , const int                           finalSet
+                        , MemoryManager* const                manager)
+:DateTimeValidator(baseValidator, facets, finalSet, DatatypeValidator::Day, manager)
 {
     init(enums);
 }
@@ -104,12 +108,15 @@ DayDatatypeValidator::DayDatatypeValidator(
 DayDatatypeValidator::~DayDatatypeValidator()
 {}
 
-DatatypeValidator* DayDatatypeValidator::newInstance(
-                                      RefHashTableOf<KVStringPair>* const facets
-                                    , RefArrayVectorOf<XMLCh>*           const enums
-                                    , const int                           finalSet)
+DatatypeValidator* DayDatatypeValidator::newInstance
+(
+      RefHashTableOf<KVStringPair>* const facets
+    , RefArrayVectorOf<XMLCh>* const      enums
+    , const int                           finalSet
+    , MemoryManager* const                manager
+)
 {
-    return (DatatypeValidator*) new DayDatatypeValidator(this, facets, enums, finalSet);
+    return (DatatypeValidator*) new (manager) DayDatatypeValidator(this, facets, enums, finalSet, manager);
 }
 
 //
@@ -117,7 +124,7 @@ DatatypeValidator* DayDatatypeValidator::newInstance(
 //
 XMLDateTime* DayDatatypeValidator::parse(const XMLCh* const content)
 {
-    XMLDateTime *pRetDate = new XMLDateTime(content);
+    XMLDateTime *pRetDate = new (fMemoryManager) XMLDateTime(content);
 
     try
     {
diff --git a/src/xercesc/validators/datatype/DayDatatypeValidator.hpp b/src/xercesc/validators/datatype/DayDatatypeValidator.hpp
index eb270f04b..24644bc53 100644
--- a/src/xercesc/validators/datatype/DayDatatypeValidator.hpp
+++ b/src/xercesc/validators/datatype/DayDatatypeValidator.hpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -85,16 +88,21 @@ public:
     // -----------------------------------------------------------------------
     //  Public ctor/dtor
     // -----------------------------------------------------------------------
-	/** @name Constructor. */
+	/** @name Constructors and Destructor*/
     //@{
 
-    DayDatatypeValidator();
-
-    DayDatatypeValidator(DatatypeValidator*            const baseValidator
-                       , RefHashTableOf<KVStringPair>* const facets
-                       , RefArrayVectorOf<XMLCh>*           const enums
-                       , const int                           finalSet);
-
+    DayDatatypeValidator
+    (
+        MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
+    DayDatatypeValidator
+    (
+        DatatypeValidator* const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
     ~DayDatatypeValidator();
 
 	//@}
@@ -103,9 +111,13 @@ public:
       * Returns an instance of the base datatype validator class
 	  * Used by the DatatypeValidatorFactory.
       */
-    virtual DatatypeValidator* newInstance(RefHashTableOf<KVStringPair>* const facets
-                                         , RefArrayVectorOf<XMLCh>*           const enums
-                                         , const int                           finalSet);
+    virtual DatatypeValidator* newInstance
+    (
+        RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
 protected:
 
diff --git a/src/xercesc/validators/datatype/DecimalDatatypeValidator.cpp b/src/xercesc/validators/datatype/DecimalDatatypeValidator.cpp
index 1edccb571..101b1be59 100644
--- a/src/xercesc/validators/datatype/DecimalDatatypeValidator.cpp
+++ b/src/xercesc/validators/datatype/DecimalDatatypeValidator.cpp
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 2001 The Apache Software Foundation.  All rights
+ * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.9  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.8  2003/03/01 20:59:06  peiyongz
  * TotalDigits value must be a positiveInteger
  *
@@ -145,6 +148,7 @@
 #include <xercesc/validators/datatype/InvalidDatatypeFacetException.hpp>
 #include <xercesc/validators/datatype/InvalidDatatypeValueException.hpp>
 #include <xercesc/util/NumberFormatException.hpp>
+#include <xercesc/util/XMLBigDecimal.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -155,8 +159,8 @@ static XMLCh value2[BUF_LEN+1];
 // ---------------------------------------------------------------------------
 //  Constructors and Destructor
 // ---------------------------------------------------------------------------
-DecimalDatatypeValidator::DecimalDatatypeValidator()
-:AbstractNumericValidator(0, 0, 0, DatatypeValidator::Decimal)
+DecimalDatatypeValidator::DecimalDatatypeValidator(MemoryManager* const manager)
+:AbstractNumericValidator(0, 0, 0, DatatypeValidator::Decimal, manager)
 , fTotalDigits(0)
 , fFractionDigits(0)
 {}
@@ -165,8 +169,9 @@ DecimalDatatypeValidator::DecimalDatatypeValidator(
                           DatatypeValidator*            const baseValidator
                         , RefHashTableOf<KVStringPair>* const facets
                         , RefArrayVectorOf<XMLCh>*           const enums
-                        , const int                           finalSet)
-:AbstractNumericValidator(baseValidator, facets, finalSet, DatatypeValidator::Decimal)
+                        , const int                           finalSet
+                        , MemoryManager* const manager)
+:AbstractNumericValidator(baseValidator, facets, finalSet, DatatypeValidator::Decimal, manager)
 , fTotalDigits(0)
 , fFractionDigits(0)
 {
@@ -182,20 +187,21 @@ DecimalDatatypeValidator::~DecimalDatatypeValidator()
 int DecimalDatatypeValidator::compare(const XMLCh* const lValue
                                     , const XMLCh* const rValue)
 {
-    XMLBigDecimal * lObj = new XMLBigDecimal(lValue);
-    Janitor<XMLBigDecimal> jname1(lObj);
-    XMLBigDecimal * rObj = new XMLBigDecimal(rValue);
-    Janitor<XMLBigDecimal> jname2(rObj);
+    XMLBigDecimal lObj(lValue);
+    XMLBigDecimal rObj(rValue);
 
-    return compareValues(lObj, rObj);
+    return compareValues(&lObj, &rObj);
 }
 
-DatatypeValidator* DecimalDatatypeValidator::newInstance(
-                                      RefHashTableOf<KVStringPair>* const facets
-                                    , RefArrayVectorOf<XMLCh>*           const enums
-                                    , const int                           finalSet)
+DatatypeValidator* DecimalDatatypeValidator::newInstance
+(
+      RefHashTableOf<KVStringPair>* const facets
+    , RefArrayVectorOf<XMLCh>* const      enums
+    , const int                           finalSet
+    , MemoryManager* const                manager
+)
 {
-    return (DatatypeValidator*) new DecimalDatatypeValidator(this, facets, enums, finalSet);
+    return (DatatypeValidator*) new (manager) DecimalDatatypeValidator(this, facets, enums, finalSet, manager);
 }
 
 // -----------------------------------------------------------------------
@@ -204,8 +210,9 @@ DatatypeValidator* DecimalDatatypeValidator::newInstance(
 DecimalDatatypeValidator::DecimalDatatypeValidator(DatatypeValidator*            const baseValidator
                                                  , RefHashTableOf<KVStringPair>* const facets
                                                  , const int                           finalSet
-                                                 , const ValidatorType                 type)
-:AbstractNumericValidator(baseValidator, facets, finalSet, type)
+                                                 , const ValidatorType                 type
+                                                 , MemoryManager* const                manager)
+:AbstractNumericValidator(baseValidator, facets, finalSet, type, manager)
 , fTotalDigits(0)
 , fFractionDigits(0)
 {
@@ -399,22 +406,22 @@ int  DecimalDatatypeValidator::compareValues(const XMLNumber* const lValue
 
 void  DecimalDatatypeValidator::setMaxInclusive(const XMLCh* const value)
 {
-    fMaxInclusive = new XMLBigDecimal(value);
+    fMaxInclusive = new (fMemoryManager) XMLBigDecimal(value);
 }
 
 void  DecimalDatatypeValidator::setMaxExclusive(const XMLCh* const value)
 {
-    fMaxExclusive = new XMLBigDecimal(value);
+    fMaxExclusive = new (fMemoryManager) XMLBigDecimal(value);
 }
 
 void  DecimalDatatypeValidator::setMinInclusive(const XMLCh* const value)
 {
-    fMinInclusive = new XMLBigDecimal(value);
+    fMinInclusive = new (fMemoryManager) XMLBigDecimal(value);
 }
 
 void  DecimalDatatypeValidator::setMinExclusive(const XMLCh* const value)
 {
-    fMinExclusive = new XMLBigDecimal(value);
+    fMinExclusive = new (fMemoryManager) XMLBigDecimal(value);
 }
 
 void DecimalDatatypeValidator::setEnumeration()
@@ -456,12 +463,12 @@ void DecimalDatatypeValidator::setEnumeration()
         checkContent(fStrEnumeration->elementAt(i), false);
     }
 
-    fEnumeration = new RefVectorOf<XMLNumber>(enumLength, true);
+    fEnumeration = new (fMemoryManager) RefVectorOf<XMLNumber>(enumLength, true);
     fEnumerationInherited = false;
 
     for ( i = 0; i < enumLength; i++)
     {
-        fEnumeration->insertElementAt(new XMLBigDecimal(fStrEnumeration->elementAt(i)), i);
+        fEnumeration->insertElementAt(new (fMemoryManager) XMLBigDecimal(fStrEnumeration->elementAt(i)), i);
     }
 
 }
@@ -485,7 +492,7 @@ void DecimalDatatypeValidator::checkContent( const XMLCh* const content, bool as
         // lazy construction
         if (getRegex() ==0) {
             try {
-                setRegex(new RegularExpression(getPattern(), SchemaSymbols::fgRegEx_XOption));
+                setRegex(new (fMemoryManager) RegularExpression(getPattern(), SchemaSymbols::fgRegEx_XOption));
             }
             catch (XMLException &e)
             {
diff --git a/src/xercesc/validators/datatype/DecimalDatatypeValidator.hpp b/src/xercesc/validators/datatype/DecimalDatatypeValidator.hpp
index 663ad3918..18ec4755d 100644
--- a/src/xercesc/validators/datatype/DecimalDatatypeValidator.hpp
+++ b/src/xercesc/validators/datatype/DecimalDatatypeValidator.hpp
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 2001 The Apache Software Foundation.  All rights
+ * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.5  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.4  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -88,7 +91,6 @@
 
 #include <xercesc/validators/datatype/AbstractNumericValidator.hpp>
 #include <xercesc/util/RefVectorOf.hpp>
-#include <xercesc/util/XMLBigDecimal.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -99,16 +101,21 @@ public:
     // -----------------------------------------------------------------------
     //  Public ctor/dtor
     // -----------------------------------------------------------------------
-	/** @name Constructor. */
+	/** @name Constructors and Destructor */
     //@{
 
-    DecimalDatatypeValidator();
-
-    DecimalDatatypeValidator(DatatypeValidator*            const baseValidator
-                           , RefHashTableOf<KVStringPair>* const facets
-                           , RefArrayVectorOf<XMLCh>*           const enums
-                           , const int                           finalSet);
-
+    DecimalDatatypeValidator
+    (
+        MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
+    DecimalDatatypeValidator
+    (
+        DatatypeValidator* const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
     virtual ~DecimalDatatypeValidator();
 
 	//@}
@@ -134,19 +141,27 @@ public:
       * Returns an instance of the base datatype validator class
 	  * Used by the DatatypeValidatorFactory.
       */
-    virtual DatatypeValidator* newInstance(RefHashTableOf<KVStringPair>* const facets
-                                         , RefArrayVectorOf<XMLCh>*           const enums
-                                         , const int                           finalSet);
+    virtual DatatypeValidator* newInstance
+    (
+        RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
 protected:
 
 // -----------------------------------------------------------------------
 // ctor provided to be used by derived classes
 // -----------------------------------------------------------------------
-    DecimalDatatypeValidator(DatatypeValidator*            const baseValidator
-                           , RefHashTableOf<KVStringPair>* const facets
-                           , const int                           finalSet
-                           , const ValidatorType                 type);
+    DecimalDatatypeValidator
+    (
+        DatatypeValidator* const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , const int finalSet
+        , const ValidatorType type
+        , MemoryManager* const manager
+    );
 
 // -----------------------------------------------------------------------
 // Abstract interface from AbstractNumericFacetValidator
diff --git a/src/xercesc/validators/datatype/DoubleDatatypeValidator.cpp b/src/xercesc/validators/datatype/DoubleDatatypeValidator.cpp
index 3326107ec..c6011482d 100644
--- a/src/xercesc/validators/datatype/DoubleDatatypeValidator.cpp
+++ b/src/xercesc/validators/datatype/DoubleDatatypeValidator.cpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -91,7 +94,6 @@
 //  Includes
 // ---------------------------------------------------------------------------
 #include <xercesc/validators/datatype/DoubleDatatypeValidator.hpp>
-#include <xercesc/validators/schema/SchemaSymbols.hpp>
 #include <xercesc/validators/datatype/InvalidDatatypeFacetException.hpp>
 #include <xercesc/validators/datatype/InvalidDatatypeValueException.hpp>
 
@@ -100,16 +102,17 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  Constructors and Destructor
 // ---------------------------------------------------------------------------
-DoubleDatatypeValidator::DoubleDatatypeValidator()
-:AbstractNumericValidator(0, 0, 0, DatatypeValidator::Double)
+DoubleDatatypeValidator::DoubleDatatypeValidator(MemoryManager* const manager)
+:AbstractNumericValidator(0, 0, 0, DatatypeValidator::Double, manager)
 {}
 
 DoubleDatatypeValidator::DoubleDatatypeValidator(
                           DatatypeValidator*            const baseValidator
                         , RefHashTableOf<KVStringPair>* const facets
-                        , RefArrayVectorOf<XMLCh>*           const enums
-                        , const int                           finalSet)
-:AbstractNumericValidator(baseValidator, facets, finalSet, DatatypeValidator::Double)
+                        , RefArrayVectorOf<XMLCh>*      const enums
+                        , const int                           finalSet
+                        , MemoryManager* const                manager)
+:AbstractNumericValidator(baseValidator, facets, finalSet, DatatypeValidator::Double, manager)
 {
     init(enums);
 }
@@ -123,20 +126,21 @@ DoubleDatatypeValidator::~DoubleDatatypeValidator()
 int DoubleDatatypeValidator::compare(const XMLCh* const lValue
                                    , const XMLCh* const rValue)
 {
-    XMLDouble * lObj = new XMLDouble(lValue);
-    Janitor<XMLDouble> jname1(lObj);
-    XMLDouble * rObj = new XMLDouble(rValue);
-    Janitor<XMLDouble> jname2(rObj);
+    XMLDouble lObj(lValue);
+    XMLDouble rObj(rValue);
 
-    return compareValues(lObj, rObj);
+    return compareValues(&lObj, &rObj);
 }
 
-DatatypeValidator* DoubleDatatypeValidator::newInstance(
-                                      RefHashTableOf<KVStringPair>* const facets
-                                    , RefArrayVectorOf<XMLCh>*           const enums
-                                    , const int                           finalSet)
+DatatypeValidator* DoubleDatatypeValidator::newInstance
+(
+      RefHashTableOf<KVStringPair>* const facets
+    , RefArrayVectorOf<XMLCh>* const      enums
+    , const int                           finalSet
+    , MemoryManager* const                manager
+)
 {
-    return (DatatypeValidator*) new DoubleDatatypeValidator(this, facets, enums, finalSet);
+    return (DatatypeValidator*) new (manager) DoubleDatatypeValidator(this, facets, enums, finalSet, manager);
 }
 
 // -----------------------------------------------------------------------
@@ -145,8 +149,9 @@ DatatypeValidator* DoubleDatatypeValidator::newInstance(
 DoubleDatatypeValidator::DoubleDatatypeValidator(DatatypeValidator*            const baseValidator
                                                , RefHashTableOf<KVStringPair>* const facets
                                                , const int                           finalSet
-                                               , const ValidatorType                 type)
-:AbstractNumericValidator(baseValidator, facets, finalSet, type)
+                                               , const ValidatorType                 type
+                                               , MemoryManager* const                manager)
+:AbstractNumericValidator(baseValidator, facets, finalSet, type, manager)
 {
     //do not invoke init here !!!
 }
@@ -176,22 +181,22 @@ int  DoubleDatatypeValidator::compareValues(const XMLNumber* const lValue
 
 void  DoubleDatatypeValidator::setMaxInclusive(const XMLCh* const value)
 {
-    fMaxInclusive = new XMLDouble(value);
+    fMaxInclusive = new (fMemoryManager) XMLDouble(value);
 }
 
 void  DoubleDatatypeValidator::setMaxExclusive(const XMLCh* const value)
 {
-    fMaxExclusive = new XMLDouble(value);
+    fMaxExclusive = new (fMemoryManager) XMLDouble(value);
 }
 
 void  DoubleDatatypeValidator::setMinInclusive(const XMLCh* const value)
 {
-    fMinInclusive = new XMLDouble(value);
+    fMinInclusive = new (fMemoryManager) XMLDouble(value);
 }
 
 void  DoubleDatatypeValidator::setMinExclusive(const XMLCh* const value)
 {
-    fMinExclusive = new XMLDouble(value);
+    fMinExclusive = new (fMemoryManager) XMLDouble(value);
 }
 
 void  DoubleDatatypeValidator::setEnumeration()
@@ -234,12 +239,12 @@ void  DoubleDatatypeValidator::setEnumeration()
         checkContent(fStrEnumeration->elementAt(i), false);
     }
 
-    fEnumeration = new RefVectorOf<XMLNumber>(enumLength, true);
+    fEnumeration = new (fMemoryManager) RefVectorOf<XMLNumber>(enumLength, true);
     fEnumerationInherited = false;
 
     for ( i = 0; i < enumLength; i++)
     {
-        fEnumeration->insertElementAt(new XMLDouble(fStrEnumeration->elementAt(i)), i);
+        fEnumeration->insertElementAt(new (fMemoryManager) XMLDouble(fStrEnumeration->elementAt(i)), i);
     }
 }
 
@@ -261,7 +266,7 @@ void DoubleDatatypeValidator::checkContent( const XMLCh* const content, bool asB
         // lazy construction
         if (getRegex() ==0) {
             try {
-                setRegex(new RegularExpression(getPattern(), SchemaSymbols::fgRegEx_XOption));
+                setRegex(new (fMemoryManager) RegularExpression(getPattern(), SchemaSymbols::fgRegEx_XOption));
             }
             catch (XMLException &e)
             {
diff --git a/src/xercesc/validators/datatype/DoubleDatatypeValidator.hpp b/src/xercesc/validators/datatype/DoubleDatatypeValidator.hpp
index 5342594d1..5b6fcaac3 100644
--- a/src/xercesc/validators/datatype/DoubleDatatypeValidator.hpp
+++ b/src/xercesc/validators/datatype/DoubleDatatypeValidator.hpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -101,16 +104,21 @@ public:
     // -----------------------------------------------------------------------
     //  Public ctor/dtor
     // -----------------------------------------------------------------------
-	/** @name Constructor. */
+	/** @name Constructors and Destructor */
     //@{
 
-    DoubleDatatypeValidator();
-
-    DoubleDatatypeValidator(DatatypeValidator*            const baseValidator
-                          , RefHashTableOf<KVStringPair>* const facets
-                          , RefArrayVectorOf<XMLCh>*           const enums
-                          , const int                           finalSet);
-
+    DoubleDatatypeValidator
+    (
+        MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
+    DoubleDatatypeValidator
+    (
+        DatatypeValidator* const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
     virtual ~DoubleDatatypeValidator();
 
 	//@}
@@ -136,19 +144,27 @@ public:
       * Returns an instance of the base datatype validator class
 	  * Used by the DatatypeValidatorFactory.
       */
-    virtual DatatypeValidator* newInstance(RefHashTableOf<KVStringPair>* const facets
-                                         , RefArrayVectorOf<XMLCh>*           const enums
-                                         , const int                           finalSet);
+    virtual DatatypeValidator* newInstance
+    (
+        RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
 protected:
 
 // -----------------------------------------------------------------------
 // ctor provided to be used by derived classes
 // -----------------------------------------------------------------------
-    DoubleDatatypeValidator(DatatypeValidator*            const baseValidator
-                          , RefHashTableOf<KVStringPair>* const facets
-                          , const int                           finalSet
-                          , const ValidatorType                 type);
+    DoubleDatatypeValidator
+    (
+        DatatypeValidator* const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , const int finalSet
+        , const ValidatorType type
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
 // -----------------------------------------------------------------------
 // Abstract interface from AbstractNumericFacetValidator
diff --git a/src/xercesc/validators/datatype/DurationDatatypeValidator.cpp b/src/xercesc/validators/datatype/DurationDatatypeValidator.cpp
index 1288a009b..5a71573e8 100644
--- a/src/xercesc/validators/datatype/DurationDatatypeValidator.cpp
+++ b/src/xercesc/validators/datatype/DurationDatatypeValidator.cpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -87,16 +90,17 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  Constructors and Destructor
 // ---------------------------------------------------------------------------
-DurationDatatypeValidator::DurationDatatypeValidator()
-:DateTimeValidator(0, 0, 0, DatatypeValidator::Duration)
+DurationDatatypeValidator::DurationDatatypeValidator(MemoryManager* const manager)
+:DateTimeValidator(0, 0, 0, DatatypeValidator::Duration, manager)
 {}
 
 DurationDatatypeValidator::DurationDatatypeValidator(
                           DatatypeValidator*            const baseValidator
                         , RefHashTableOf<KVStringPair>* const facets
-                        , RefArrayVectorOf<XMLCh>*           const enums
-                        , const int                           finalSet)
-:DateTimeValidator(baseValidator, facets, finalSet, DatatypeValidator::Duration)
+                        , RefArrayVectorOf<XMLCh>*      const enums
+                        , const int                           finalSet
+                        , MemoryManager* const                manager)
+:DateTimeValidator(baseValidator, facets, finalSet, DatatypeValidator::Duration, manager)
 {
     init(enums);
 }
@@ -104,12 +108,15 @@ DurationDatatypeValidator::DurationDatatypeValidator(
 DurationDatatypeValidator::~DurationDatatypeValidator()
 {}
 
-DatatypeValidator* DurationDatatypeValidator::newInstance(
-                                      RefHashTableOf<KVStringPair>* const facets
-                                    , RefArrayVectorOf<XMLCh>*           const enums
-                                    , const int                           finalSet)
+DatatypeValidator* DurationDatatypeValidator::newInstance
+(
+      RefHashTableOf<KVStringPair>* const facets
+    , RefArrayVectorOf<XMLCh>* const      enums
+    , const int                           finalSet
+    , MemoryManager* const                manager
+)
 {
-    return (DatatypeValidator*) new DurationDatatypeValidator(this, facets, enums, finalSet);
+    return (DatatypeValidator*) new (manager) DurationDatatypeValidator(this, facets, enums, finalSet, manager);
 }
 
 //
@@ -117,7 +124,7 @@ DatatypeValidator* DurationDatatypeValidator::newInstance(
 //
 XMLDateTime* DurationDatatypeValidator::parse(const XMLCh* const content)
 {
-    XMLDateTime *pRetDate = new XMLDateTime(content);
+    XMLDateTime *pRetDate = new (fMemoryManager) XMLDateTime(content);
 
     try
     {
diff --git a/src/xercesc/validators/datatype/DurationDatatypeValidator.hpp b/src/xercesc/validators/datatype/DurationDatatypeValidator.hpp
index e411e9b20..744efc08e 100644
--- a/src/xercesc/validators/datatype/DurationDatatypeValidator.hpp
+++ b/src/xercesc/validators/datatype/DurationDatatypeValidator.hpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -85,28 +88,36 @@ public:
     // -----------------------------------------------------------------------
     //  Public ctor/dtor
     // -----------------------------------------------------------------------
-	/** @name Constructor. */
+	/** @name Constructors and Destructor. */
     //@{
 
-    DurationDatatypeValidator();
-
-    DurationDatatypeValidator(DatatypeValidator*            const baseValidator
-                            , RefHashTableOf<KVStringPair>* const facets
-                            , RefArrayVectorOf<XMLCh>*           const enums
-                            , const int                           finalSet);
-
+    DurationDatatypeValidator
+    (
+        MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
+    DurationDatatypeValidator
+    (
+        DatatypeValidator* const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
     ~DurationDatatypeValidator();
 
-
 	//@}
 
     /**
       * Returns an instance of the base datatype validator class
 	  * Used by the DatatypeValidatorFactory.
       */
-    virtual DatatypeValidator* newInstance(RefHashTableOf<KVStringPair>* const facets
-                                         , RefArrayVectorOf<XMLCh>*           const enums
-                                         , const int                           finalSet);
+    virtual DatatypeValidator* newInstance
+    (
+        RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
 protected:
 
diff --git a/src/xercesc/validators/datatype/ENTITYDatatypeValidator.cpp b/src/xercesc/validators/datatype/ENTITYDatatypeValidator.cpp
index aa3d3f4e1..43a45ef29 100644
--- a/src/xercesc/validators/datatype/ENTITYDatatypeValidator.cpp
+++ b/src/xercesc/validators/datatype/ENTITYDatatypeValidator.cpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.6  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.5  2003/01/06 19:40:05  knoaman
  * Throw an invalid datatype value exception if fEntityDeclPool is NULL.
  *
@@ -107,17 +110,18 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  Constructors and Destructor
 // ---------------------------------------------------------------------------
-ENTITYDatatypeValidator::ENTITYDatatypeValidator()
-:StringDatatypeValidator(0, 0, 0, DatatypeValidator::ENTITY)
+ENTITYDatatypeValidator::ENTITYDatatypeValidator(MemoryManager* const manager)
+:StringDatatypeValidator(0, 0, 0, DatatypeValidator::ENTITY, manager)
 ,fEntityDeclPool(0)
 {}
 
 ENTITYDatatypeValidator::ENTITYDatatypeValidator(
                           DatatypeValidator*            const baseValidator
                         , RefHashTableOf<KVStringPair>* const facets
-                        , RefArrayVectorOf<XMLCh>*           const enums
-                        , const int                           finalSet)
-:StringDatatypeValidator(baseValidator, facets, finalSet, DatatypeValidator::ENTITY)
+                        , RefArrayVectorOf<XMLCh>*      const enums
+                        , const int                           finalSet
+                        , MemoryManager* const                manager)
+:StringDatatypeValidator(baseValidator, facets, finalSet, DatatypeValidator::ENTITY, manager)
 ,fEntityDeclPool(0)
 {
     init(enums);
@@ -126,12 +130,15 @@ ENTITYDatatypeValidator::ENTITYDatatypeValidator(
 ENTITYDatatypeValidator::~ENTITYDatatypeValidator()
 {}
 
-DatatypeValidator* ENTITYDatatypeValidator::newInstance(
-                                      RefHashTableOf<KVStringPair>* const facets
-                                    , RefArrayVectorOf<XMLCh>*           const enums
-                                    , const int                           finalSet)
+DatatypeValidator* ENTITYDatatypeValidator::newInstance
+(
+      RefHashTableOf<KVStringPair>* const facets
+    , RefArrayVectorOf<XMLCh>* const      enums
+    , const int                           finalSet
+    , MemoryManager* const                manager
+)
 {
-    return (DatatypeValidator*) new ENTITYDatatypeValidator(this, facets, enums, finalSet);
+    return (DatatypeValidator*) new (manager) ENTITYDatatypeValidator(this, facets, enums, finalSet, manager);
 }
 
 // -----------------------------------------------------------------------
diff --git a/src/xercesc/validators/datatype/ENTITYDatatypeValidator.hpp b/src/xercesc/validators/datatype/ENTITYDatatypeValidator.hpp
index 636fc3ffb..e34354789 100644
--- a/src/xercesc/validators/datatype/ENTITYDatatypeValidator.hpp
+++ b/src/xercesc/validators/datatype/ENTITYDatatypeValidator.hpp
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 2001 The Apache Software Foundation.  All rights
+ * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -94,7 +97,8 @@
 #define ENTITY_DATATYPEVALIDATOR_HPP
 
 #include <xercesc/validators/datatype/StringDatatypeValidator.hpp>
-#include <xercesc/internal/XMLScanner.hpp>
+#include <xercesc/util/NameIdPool.hpp>
+#include <xercesc/validators/DTD/DTDEntityDecl.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -105,15 +109,21 @@ public:
     // -----------------------------------------------------------------------
     //  Public ctor/dtor
     // -----------------------------------------------------------------------
-	/** @name Constructor. */
+	/** @name Constructors and Destructor. */
     //@{
 
-    ENTITYDatatypeValidator();
-
-    ENTITYDatatypeValidator(DatatypeValidator*            const baseValidator
-                          , RefHashTableOf<KVStringPair>* const facets
-                          , RefArrayVectorOf<XMLCh>*           const enums
-                          , const int                           finalSet);
+    ENTITYDatatypeValidator
+    (
+        MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
+    ENTITYDatatypeValidator
+    (
+        DatatypeValidator* const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
     virtual ~ENTITYDatatypeValidator();
 
@@ -158,9 +168,13 @@ public:
       * Returns an instance of the base datatype validator class
 	  * Used by the DatatypeValidatorFactory.
       */
-    virtual DatatypeValidator* newInstance(RefHashTableOf<KVStringPair>* const facets
-                                         , RefArrayVectorOf<XMLCh>*           const enums
-                                         , const int                           finalSet);
+    virtual DatatypeValidator* newInstance
+    (
+        RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
 // -----------------------------------------------------------------------
 // Setter methods
diff --git a/src/xercesc/validators/datatype/FloatDatatypeValidator.cpp b/src/xercesc/validators/datatype/FloatDatatypeValidator.cpp
index 0956a7400..263df44a9 100644
--- a/src/xercesc/validators/datatype/FloatDatatypeValidator.cpp
+++ b/src/xercesc/validators/datatype/FloatDatatypeValidator.cpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -101,16 +104,17 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  Constructors and Destructor
 // ---------------------------------------------------------------------------
-FloatDatatypeValidator::FloatDatatypeValidator()
-:AbstractNumericValidator(0, 0, 0, DatatypeValidator::Float)
+FloatDatatypeValidator::FloatDatatypeValidator(MemoryManager* const manager)
+:AbstractNumericValidator(0, 0, 0, DatatypeValidator::Float, manager)
 {}
 
 FloatDatatypeValidator::FloatDatatypeValidator(
                           DatatypeValidator*            const baseValidator
                         , RefHashTableOf<KVStringPair>* const facets
-                        , RefArrayVectorOf<XMLCh>*           const enums
-                        , const int                           finalSet)
-:AbstractNumericValidator(baseValidator, facets, finalSet, DatatypeValidator::Float)
+                        , RefArrayVectorOf<XMLCh>*      const enums
+                        , const int                           finalSet
+                        , MemoryManager* const                manager)
+:AbstractNumericValidator(baseValidator, facets, finalSet, DatatypeValidator::Float, manager)
 {
     init(enums);
 }
@@ -124,20 +128,21 @@ FloatDatatypeValidator::~FloatDatatypeValidator()
 int FloatDatatypeValidator::compare(const XMLCh* const lValue
                                   , const XMLCh* const rValue)
 {
-    XMLFloat * lObj = new XMLFloat(lValue);
-    Janitor<XMLFloat> jname1(lObj);
-    XMLFloat * rObj = new XMLFloat(rValue);
-    Janitor<XMLFloat> jname2(rObj);
+    XMLFloat lObj(lValue);
+    XMLFloat rObj(rValue);
 
-    return compareValues(lObj, rObj);
+    return compareValues(&lObj, &rObj);
 }
 
-DatatypeValidator* FloatDatatypeValidator::newInstance(
-                                      RefHashTableOf<KVStringPair>* const facets
-                                    , RefArrayVectorOf<XMLCh>*           const enums
-                                    , const int                           finalSet)
+DatatypeValidator* FloatDatatypeValidator::newInstance
+(
+      RefHashTableOf<KVStringPair>* const facets
+    , RefArrayVectorOf<XMLCh>* const      enums
+    , const int                           finalSet
+    , MemoryManager* const                manager
+)
 {
-    return (DatatypeValidator*) new FloatDatatypeValidator(this, facets, enums, finalSet);
+    return (DatatypeValidator*) new (manager) FloatDatatypeValidator(this, facets, enums, finalSet, manager);
 }
 
 // -----------------------------------------------------------------------
@@ -146,8 +151,9 @@ DatatypeValidator* FloatDatatypeValidator::newInstance(
 FloatDatatypeValidator::FloatDatatypeValidator(DatatypeValidator*            const baseValidator
                                              , RefHashTableOf<KVStringPair>* const facets
                                              , const int                           finalSet
-                                             , const ValidatorType                 type)
-:AbstractNumericValidator(baseValidator, facets, finalSet, type)
+                                             , const ValidatorType                 type
+                                             , MemoryManager* const                manager)
+:AbstractNumericValidator(baseValidator, facets, finalSet, type, manager)
 {
     //do not invoke init here !!!
 }
@@ -177,22 +183,22 @@ int  FloatDatatypeValidator::compareValues(const XMLNumber* const lValue
 
 void  FloatDatatypeValidator::setMaxInclusive(const XMLCh* const value)
 {
-    fMaxInclusive = new XMLFloat(value);
+    fMaxInclusive = new (fMemoryManager) XMLFloat(value);
 }
 
 void  FloatDatatypeValidator::setMaxExclusive(const XMLCh* const value)
 {
-    fMaxExclusive = new XMLFloat(value);
+    fMaxExclusive = new (fMemoryManager) XMLFloat(value);
 }
 
 void  FloatDatatypeValidator::setMinInclusive(const XMLCh* const value)
 {
-    fMinInclusive = new XMLFloat(value);
+    fMinInclusive = new (fMemoryManager) XMLFloat(value);
 }
 
 void  FloatDatatypeValidator::setMinExclusive(const XMLCh* const value)
 {
-    fMinExclusive = new XMLFloat(value);
+    fMinExclusive = new (fMemoryManager) XMLFloat(value);
 }
 
 void  FloatDatatypeValidator::setEnumeration()
@@ -235,12 +241,12 @@ void  FloatDatatypeValidator::setEnumeration()
         checkContent(fStrEnumeration->elementAt(i), false);
     }
 
-    fEnumeration = new RefVectorOf<XMLNumber>(enumLength, true);
+    fEnumeration = new (fMemoryManager) RefVectorOf<XMLNumber>(enumLength, true);
     fEnumerationInherited = false;
 
     for ( i = 0; i < enumLength; i++)
     {
-        fEnumeration->insertElementAt(new XMLFloat(fStrEnumeration->elementAt(i)), i);
+        fEnumeration->insertElementAt(new (fMemoryManager) XMLFloat(fStrEnumeration->elementAt(i)), i);
     }
 }
 
@@ -261,7 +267,7 @@ void FloatDatatypeValidator::checkContent( const XMLCh* const content, bool asBa
         // lazy construction
         if (getRegex() ==0) {
             try {
-                setRegex(new RegularExpression(getPattern(), SchemaSymbols::fgRegEx_XOption));
+                setRegex(new (fMemoryManager) RegularExpression(getPattern(), SchemaSymbols::fgRegEx_XOption));
             }
             catch (XMLException &e)
             {
diff --git a/src/xercesc/validators/datatype/FloatDatatypeValidator.hpp b/src/xercesc/validators/datatype/FloatDatatypeValidator.hpp
index 28f58f6ff..9079d0a27 100644
--- a/src/xercesc/validators/datatype/FloatDatatypeValidator.hpp
+++ b/src/xercesc/validators/datatype/FloatDatatypeValidator.hpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -102,16 +105,20 @@ public:
     // -----------------------------------------------------------------------
     //  Public ctor/dtor
     // -----------------------------------------------------------------------
-	/** @name Constructor. */
+	/** @name Constructors and Destructor */
     //@{
-
-    FloatDatatypeValidator();
-
-    FloatDatatypeValidator(DatatypeValidator*            const baseValidator
-                         , RefHashTableOf<KVStringPair>* const facets
-                         , RefArrayVectorOf<XMLCh>*           const enums
-                         , const int                           finalSet);
-
+    FloatDatatypeValidator
+    (
+        MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
+    FloatDatatypeValidator
+    (
+        DatatypeValidator* const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
     virtual ~FloatDatatypeValidator();
 
 	//@}
@@ -137,23 +144,31 @@ public:
       * Returns an instance of the base datatype validator class
 	  * Used by the DatatypeValidatorFactory.
       */
-    virtual DatatypeValidator* newInstance(RefHashTableOf<KVStringPair>* const facets
-                                         , RefArrayVectorOf<XMLCh>*           const enums
-                                         , const int                           finalSet);
+    virtual DatatypeValidator* newInstance
+    (
+        RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
 protected:
 
-// -----------------------------------------------------------------------
-// ctor provided to be used by derived classes
-// -----------------------------------------------------------------------
-    FloatDatatypeValidator(DatatypeValidator*            const baseValidator
-                         , RefHashTableOf<KVStringPair>* const facets
-                         , const int                           finalSet
-                         , const ValidatorType                 type);
+    // -----------------------------------------------------------------------
+    // ctor provided to be used by derived classes
+    // -----------------------------------------------------------------------
+    FloatDatatypeValidator
+    (
+        DatatypeValidator* const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , const int finalSet
+        , const ValidatorType type
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
-// -----------------------------------------------------------------------
-// Abstract interface from AbstractNumericFacetValidator
-// -----------------------------------------------------------------------
+    // -----------------------------------------------------------------------
+    // Abstract interface from AbstractNumericFacetValidator
+    // -----------------------------------------------------------------------
 
     virtual void assignAdditionalFacet(const XMLCh* const key
                                      , const XMLCh* const value);
diff --git a/src/xercesc/validators/datatype/HexBinaryDatatypeValidator.cpp b/src/xercesc/validators/datatype/HexBinaryDatatypeValidator.cpp
index c19ac5885..509f71b46 100644
--- a/src/xercesc/validators/datatype/HexBinaryDatatypeValidator.cpp
+++ b/src/xercesc/validators/datatype/HexBinaryDatatypeValidator.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -117,8 +120,8 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  Constructors and Destructor
 // ---------------------------------------------------------------------------
-HexBinaryDatatypeValidator::HexBinaryDatatypeValidator()
-:AbstractStringValidator(0, 0, 0, DatatypeValidator::HexBinary)
+HexBinaryDatatypeValidator::HexBinaryDatatypeValidator(MemoryManager* const manager)
+:AbstractStringValidator(0, 0, 0, DatatypeValidator::HexBinary, manager)
 {}
 
 HexBinaryDatatypeValidator::~HexBinaryDatatypeValidator()
@@ -127,19 +130,23 @@ HexBinaryDatatypeValidator::~HexBinaryDatatypeValidator()
 HexBinaryDatatypeValidator::HexBinaryDatatypeValidator(
                           DatatypeValidator*            const baseValidator
                         , RefHashTableOf<KVStringPair>* const facets
-                        , RefArrayVectorOf<XMLCh>*           const enums
-                        , const int                           finalSet)
-:AbstractStringValidator(baseValidator, facets, finalSet, DatatypeValidator::HexBinary)
+                        , RefArrayVectorOf<XMLCh>*      const enums
+                        , const int                           finalSet
+                        , MemoryManager* const                manager)
+:AbstractStringValidator(baseValidator, facets, finalSet, DatatypeValidator::HexBinary, manager)
 {
     init(enums);
 }
 
-DatatypeValidator* HexBinaryDatatypeValidator::newInstance(
-                                      RefHashTableOf<KVStringPair>* const facets
-                                    , RefArrayVectorOf<XMLCh>*           const enums
-                                    , const int                           finalSet)
+DatatypeValidator* HexBinaryDatatypeValidator::newInstance
+(
+      RefHashTableOf<KVStringPair>* const facets
+    , RefArrayVectorOf<XMLCh>* const      enums
+    , const int                           finalSet
+    , MemoryManager* const                manager
+)
 {
-    return (DatatypeValidator*) new HexBinaryDatatypeValidator(this, facets, enums, finalSet);
+    return (DatatypeValidator*) new (manager) HexBinaryDatatypeValidator(this, facets, enums, finalSet, manager);
 }
 
 // ---------------------------------------------------------------------------
diff --git a/src/xercesc/validators/datatype/HexBinaryDatatypeValidator.hpp b/src/xercesc/validators/datatype/HexBinaryDatatypeValidator.hpp
index 723145580..ebc9f34c3 100644
--- a/src/xercesc/validators/datatype/HexBinaryDatatypeValidator.hpp
+++ b/src/xercesc/validators/datatype/HexBinaryDatatypeValidator.hpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -88,15 +91,21 @@ public:
     // -----------------------------------------------------------------------
     //  Public ctor/dtor
     // -----------------------------------------------------------------------
-	/** @name Constructor. */
+	/** @name Constructors and Destructor */
     //@{
 
-    HexBinaryDatatypeValidator();
-
-    HexBinaryDatatypeValidator(DatatypeValidator*            const baseValidator
-                             , RefHashTableOf<KVStringPair>* const facets
-                             , RefArrayVectorOf<XMLCh>*           const enums
-                             , const int                           finalSet);
+    HexBinaryDatatypeValidator
+    (
+        MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
+    HexBinaryDatatypeValidator
+    (
+        DatatypeValidator* const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
     virtual ~HexBinaryDatatypeValidator();
 
@@ -106,9 +115,13 @@ public:
       * Returns an instance of the base datatype validator class
 	  * Used by the DatatypeValidatorFactory.
       */
-    virtual DatatypeValidator* newInstance(RefHashTableOf<KVStringPair>* const facets
-                                         , RefArrayVectorOf<XMLCh>*           const enums
-                                         , const int                           finalSet);
+    virtual DatatypeValidator* newInstance
+    (
+        RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
 
 protected:
diff --git a/src/xercesc/validators/datatype/IDDatatypeValidator.cpp b/src/xercesc/validators/datatype/IDDatatypeValidator.cpp
index 3298cec17..aab8261e1 100644
--- a/src/xercesc/validators/datatype/IDDatatypeValidator.cpp
+++ b/src/xercesc/validators/datatype/IDDatatypeValidator.cpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -99,17 +102,18 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  Constructors and Destructor
 // ---------------------------------------------------------------------------
-IDDatatypeValidator::IDDatatypeValidator()
-:StringDatatypeValidator(0, 0, 0, DatatypeValidator::ID)
+IDDatatypeValidator::IDDatatypeValidator(MemoryManager* const manager)
+:StringDatatypeValidator(0, 0, 0, DatatypeValidator::ID, manager)
 ,fIDRefList(0)
 {}
 
 IDDatatypeValidator::IDDatatypeValidator(
                           DatatypeValidator*            const baseValidator
                         , RefHashTableOf<KVStringPair>* const facets
-                        , RefArrayVectorOf<XMLCh>*           const enums
-                        , const int                           finalSet)
-:StringDatatypeValidator(baseValidator, facets, finalSet, DatatypeValidator::ID)
+                        , RefArrayVectorOf<XMLCh>*      const enums
+                        , const int                           finalSet
+                        , MemoryManager* const                manager)
+:StringDatatypeValidator(baseValidator, facets, finalSet, DatatypeValidator::ID, manager)
 ,fIDRefList(0)
 {
     init(enums);
@@ -118,20 +122,24 @@ IDDatatypeValidator::IDDatatypeValidator(
 IDDatatypeValidator::~IDDatatypeValidator()
 {}
 
-DatatypeValidator* IDDatatypeValidator::newInstance(
-                                      RefHashTableOf<KVStringPair>* const facets
-                                    , RefArrayVectorOf<XMLCh>*           const enums
-                                    , const int                           finalSet)
+DatatypeValidator* IDDatatypeValidator::newInstance
+(
+      RefHashTableOf<KVStringPair>* const facets
+    , RefArrayVectorOf<XMLCh>* const      enums
+    , const int                           finalSet
+    , MemoryManager* const                manager
+)
 {
-    return (DatatypeValidator*) new IDDatatypeValidator(this, facets, enums, finalSet);
+    return (DatatypeValidator*) new (manager) IDDatatypeValidator(this, facets, enums, finalSet, manager);
 }
 
 IDDatatypeValidator::IDDatatypeValidator(
                           DatatypeValidator*            const baseValidator
                         , RefHashTableOf<KVStringPair>* const facets
                         , const int                           finalSet
-                        , const ValidatorType                 type)
-:StringDatatypeValidator(baseValidator, facets, finalSet, type)
+                        , const ValidatorType                 type
+                        , MemoryManager* const                manager)
+:StringDatatypeValidator(baseValidator, facets, finalSet, type, manager)
 ,fIDRefList(0)
 {
     // do not invoke init() here!!!
@@ -164,7 +172,7 @@ void IDDatatypeValidator::addId(const XMLCh * const content)
     }
      else
     {
-        find = new XMLRefInfo(content);
+        find = new (fMemoryManager) XMLRefInfo(content);
         fIDRefList->put((void*)find->getRefName(), find);
     }
 
diff --git a/src/xercesc/validators/datatype/IDDatatypeValidator.hpp b/src/xercesc/validators/datatype/IDDatatypeValidator.hpp
index bfe12c91e..9c8fba25c 100644
--- a/src/xercesc/validators/datatype/IDDatatypeValidator.hpp
+++ b/src/xercesc/validators/datatype/IDDatatypeValidator.hpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -99,7 +102,6 @@
 #define ID_DATATYPEVALIDATOR_HPP
 
 #include <xercesc/validators/datatype/StringDatatypeValidator.hpp>
-#include <xercesc/validators/schema/SchemaSymbols.hpp>
 #include <xercesc/framework/XMLRefInfo.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
@@ -111,16 +113,21 @@ public:
     // -----------------------------------------------------------------------
     //  Public ctor/dtor
     // -----------------------------------------------------------------------
-	/** @name Constructor. */
+	/** @name Constructors and Destructor */
     //@{
 
-    IDDatatypeValidator();
-
-    IDDatatypeValidator(DatatypeValidator*            const baseValidator
-                      , RefHashTableOf<KVStringPair>* const facets
-                      , RefArrayVectorOf<XMLCh>*           const enums
-                      , const int                           finalSet);
-
+    IDDatatypeValidator
+    (
+        MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
+    IDDatatypeValidator
+    (
+        DatatypeValidator*            const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>*           const enums
+        , const int                           finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
     virtual ~IDDatatypeValidator();
 
 	//@}
@@ -145,9 +152,13 @@ public:
       * Returns an instance of the base datatype validator class
 	  * Used by the DatatypeValidatorFactory.
       */
-    virtual DatatypeValidator* newInstance(RefHashTableOf<KVStringPair>* const facets
-                                         , RefArrayVectorOf<XMLCh>*           const enums
-                                         , const int                           finalSet);
+    virtual DatatypeValidator* newInstance
+    (
+        RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
     //@}
 
@@ -158,10 +169,14 @@ protected:
     //
     // ctor provided to be used by derived classes
     //
-    IDDatatypeValidator(DatatypeValidator*            const baseValidator
-                      , RefHashTableOf<KVStringPair>* const facets
-                      , const int                           finalSet
-                      , const ValidatorType                 type);
+    IDDatatypeValidator
+    (
+        DatatypeValidator*            const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , const int                           finalSet
+        , const ValidatorType                 type
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
     virtual void checkValueSpace(const XMLCh* const content);
 
diff --git a/src/xercesc/validators/datatype/IDREFDatatypeValidator.cpp b/src/xercesc/validators/datatype/IDREFDatatypeValidator.cpp
index df8e7544a..bd457c596 100644
--- a/src/xercesc/validators/datatype/IDREFDatatypeValidator.cpp
+++ b/src/xercesc/validators/datatype/IDREFDatatypeValidator.cpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -97,17 +100,18 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  Constructors and Destructor
 // ---------------------------------------------------------------------------
-IDREFDatatypeValidator::IDREFDatatypeValidator()
-:StringDatatypeValidator(0, 0, 0, DatatypeValidator::IDREF)
+IDREFDatatypeValidator::IDREFDatatypeValidator(MemoryManager* const manager)
+:StringDatatypeValidator(0, 0, 0, DatatypeValidator::IDREF, manager)
 ,fIDRefList(0)
 {}
 
 IDREFDatatypeValidator::IDREFDatatypeValidator(
                                            DatatypeValidator*            const baseValidator
                                          , RefHashTableOf<KVStringPair>* const facets
-                                         , RefArrayVectorOf<XMLCh>*           const enums
-                                         , const int                           finalSet)
-:StringDatatypeValidator(baseValidator, facets, finalSet, DatatypeValidator::IDREF)
+                                         , RefArrayVectorOf<XMLCh>*      const enums
+                                         , const int                           finalSet
+                                         , MemoryManager* const                manager)
+:StringDatatypeValidator(baseValidator, facets, finalSet, DatatypeValidator::IDREF, manager)
 ,fIDRefList(0)
 {
     init(enums);
@@ -116,20 +120,24 @@ IDREFDatatypeValidator::IDREFDatatypeValidator(
 IDREFDatatypeValidator::~IDREFDatatypeValidator()
 {}
 
-DatatypeValidator* IDREFDatatypeValidator::newInstance(
-                                      RefHashTableOf<KVStringPair>* const facets
-                                    , RefArrayVectorOf<XMLCh>*           const enums
-                                    , const int                           finalSet)
+DatatypeValidator* IDREFDatatypeValidator::newInstance
+(
+      RefHashTableOf<KVStringPair>* const facets
+    , RefArrayVectorOf<XMLCh>* const      enums
+    , const int                           finalSet
+    , MemoryManager* const                manager
+)
 {
-    return (DatatypeValidator*) new IDREFDatatypeValidator(this, facets, enums, finalSet);
+    return (DatatypeValidator*) new (manager) IDREFDatatypeValidator(this, facets, enums, finalSet, manager);
 }
 
 IDREFDatatypeValidator::IDREFDatatypeValidator(
                           DatatypeValidator*            const baseValidator
                         , RefHashTableOf<KVStringPair>* const facets
                         , const int                           finalSet
-                        , const ValidatorType                 type)
-:StringDatatypeValidator(baseValidator, facets, finalSet, type)
+                        , const ValidatorType                 type
+                        , MemoryManager* const                manager)
+:StringDatatypeValidator(baseValidator, facets, finalSet, type, manager)
 ,fIDRefList(0)
 {
     // do not invoke init() here!!!
@@ -158,7 +166,7 @@ void IDREFDatatypeValidator::addIdRef(const XMLCh* const content)
     XMLRefInfo* find = fIDRefList->get(content);
     if (!find)
     {
-        find = new XMLRefInfo(content);
+        find = new (fMemoryManager) XMLRefInfo(content);
         fIDRefList->put((void*)find->getRefName(), find);
     }
 
diff --git a/src/xercesc/validators/datatype/IDREFDatatypeValidator.hpp b/src/xercesc/validators/datatype/IDREFDatatypeValidator.hpp
index 8158cb224..c01547928 100644
--- a/src/xercesc/validators/datatype/IDREFDatatypeValidator.hpp
+++ b/src/xercesc/validators/datatype/IDREFDatatypeValidator.hpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -108,15 +111,21 @@ public:
     // -----------------------------------------------------------------------
     //  Public ctor/dtor
     // -----------------------------------------------------------------------
-	/** @name Constructor. */
+	/** @name Constructors and Destructor */
     //@{
 
-    IDREFDatatypeValidator();
-
-    IDREFDatatypeValidator(DatatypeValidator*            const baseValidator
-                         , RefHashTableOf<KVStringPair>* const facets
-                         , RefArrayVectorOf<XMLCh>*           const enums
-                         , const int                           finalSet);
+    IDREFDatatypeValidator
+    (
+        MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
+    IDREFDatatypeValidator
+    (
+        DatatypeValidator* const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
     virtual ~IDREFDatatypeValidator();
 
@@ -144,9 +153,13 @@ public:
       * Returns an instance of the base datatype validator class
 	  * Used by the DatatypeValidatorFactory.
       */
-    virtual DatatypeValidator* newInstance(RefHashTableOf<KVStringPair>* const facets
-                                         , RefArrayVectorOf<XMLCh>*           const enums
-                                         , const int                           finalSet);
+    virtual DatatypeValidator* newInstance
+    (
+        RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
     inline void setIDRefList(RefHashTableOf<XMLRefInfo>* fIDRefList);
 
@@ -155,10 +168,14 @@ protected:
     //
     // ctor provided to be used by derived classes
     //
-    IDREFDatatypeValidator(DatatypeValidator*            const baseValidator
-                         , RefHashTableOf<KVStringPair>* const facets
-                         , const int                           finalSet
-                         , const ValidatorType                 type);
+    IDREFDatatypeValidator
+    (
+        DatatypeValidator* const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , const int finalSet
+        , const ValidatorType type
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
     virtual void checkValueSpace(const XMLCh* const content);
 
diff --git a/src/xercesc/validators/datatype/ListDatatypeValidator.cpp b/src/xercesc/validators/datatype/ListDatatypeValidator.cpp
index 7626142ab..7fbef053a 100644
--- a/src/xercesc/validators/datatype/ListDatatypeValidator.cpp
+++ b/src/xercesc/validators/datatype/ListDatatypeValidator.cpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.8  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.7  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -123,8 +126,8 @@ static XMLCh value2[BUF_LEN+1];
 // ---------------------------------------------------------------------------
 //  Constructors and Destructor
 // ---------------------------------------------------------------------------
-ListDatatypeValidator::ListDatatypeValidator()
-:AbstractStringValidator(0, 0, 0, DatatypeValidator::List)
+ListDatatypeValidator::ListDatatypeValidator(MemoryManager* const manager)
+:AbstractStringValidator(0, 0, 0, DatatypeValidator::List, manager)
 ,fContent(0)
 {}
 
@@ -132,8 +135,9 @@ ListDatatypeValidator::ListDatatypeValidator(
                           DatatypeValidator*            const baseValidator
                         , RefHashTableOf<KVStringPair>* const facets
                         , RefArrayVectorOf<XMLCh>*           const enums
-                        , const int                           finalSet)
-:AbstractStringValidator(baseValidator, facets, finalSet, DatatypeValidator::List)
+                        , const int                           finalSet
+                        , MemoryManager* const manager)
+:AbstractStringValidator(baseValidator, facets, finalSet, DatatypeValidator::List, manager)
 ,fContent(0)
 {
     //
@@ -152,12 +156,15 @@ ListDatatypeValidator::ListDatatypeValidator(
 ListDatatypeValidator::~ListDatatypeValidator()
 {}
 
-DatatypeValidator* ListDatatypeValidator::newInstance(
-                                      RefHashTableOf<KVStringPair>* const facets
-                                    , RefArrayVectorOf<XMLCh>*           const enums
-                                    , const int                           finalSet)
+DatatypeValidator* ListDatatypeValidator::newInstance
+(
+      RefHashTableOf<KVStringPair>* const facets
+    , RefArrayVectorOf<XMLCh>* const      enums
+    , const int                           finalSet
+    , MemoryManager* const                manager
+)
 {
-    return (DatatypeValidator*) new ListDatatypeValidator(this, facets, enums, finalSet);
+    return (DatatypeValidator*) new (manager) ListDatatypeValidator(this, facets, enums, finalSet, manager);
 }
 
 
@@ -232,7 +239,7 @@ void ListDatatypeValidator::checkContent( BaseRefVectorOf<XMLCh>* tokenVector
         if (getRegex() == 0)
         {
             try {
-                setRegex(new RegularExpression(getPattern(), SchemaSymbols::fgRegEx_XOption));
+                setRegex(new (fMemoryManager) RegularExpression(getPattern(), SchemaSymbols::fgRegEx_XOption));
             }
             catch (XMLException &e)
             {
diff --git a/src/xercesc/validators/datatype/ListDatatypeValidator.hpp b/src/xercesc/validators/datatype/ListDatatypeValidator.hpp
index 9212ea3b5..cd94cd60a 100644
--- a/src/xercesc/validators/datatype/ListDatatypeValidator.hpp
+++ b/src/xercesc/validators/datatype/ListDatatypeValidator.hpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.6  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.5  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -122,16 +125,21 @@ public:
     // -----------------------------------------------------------------------
     //  Public ctor/dtor
     // -----------------------------------------------------------------------
-	/** @name Constructor. */
+	/** @name Constructors and Destructor */
     //@{
 
-    ListDatatypeValidator();
-
-    ListDatatypeValidator(DatatypeValidator*            const baseValidator
-                        , RefHashTableOf<KVStringPair>* const facets
-                        , RefArrayVectorOf<XMLCh>*           const enums
-                        , const int                           finalSet);
-
+    ListDatatypeValidator
+    (
+        MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
+    ListDatatypeValidator
+    (
+        DatatypeValidator* const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
     virtual ~ListDatatypeValidator();
 
 	//@}
@@ -183,9 +191,13 @@ public:
       * Returns an instance of the base datatype validator class
 	  * Used by the DatatypeValidatorFactory.
       */
-    virtual DatatypeValidator* newInstance(RefHashTableOf<KVStringPair>* const facets
-                                         , RefArrayVectorOf<XMLCh>*           const enums
-                                         , const int                           finalSet);
+    virtual DatatypeValidator* newInstance
+    (
+        RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
     DatatypeValidator* getItemTypeDTV() const;
 
diff --git a/src/xercesc/validators/datatype/MonthDatatypeValidator.cpp b/src/xercesc/validators/datatype/MonthDatatypeValidator.cpp
index 6bd54a415..cebfb2a0b 100644
--- a/src/xercesc/validators/datatype/MonthDatatypeValidator.cpp
+++ b/src/xercesc/validators/datatype/MonthDatatypeValidator.cpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -87,16 +90,17 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  Constructors and Destructor
 // ---------------------------------------------------------------------------
-MonthDatatypeValidator::MonthDatatypeValidator()
-:DateTimeValidator(0, 0, 0, DatatypeValidator::Month)
+MonthDatatypeValidator::MonthDatatypeValidator(MemoryManager* const manager)
+:DateTimeValidator(0, 0, 0, DatatypeValidator::Month, manager)
 {}
 
 MonthDatatypeValidator::MonthDatatypeValidator(
                           DatatypeValidator*            const baseValidator
                         , RefHashTableOf<KVStringPair>* const facets
-                        , RefArrayVectorOf<XMLCh>*           const enums
-                        , const int                           finalSet)
-:DateTimeValidator(baseValidator, facets, finalSet, DatatypeValidator::Month)
+                        , RefArrayVectorOf<XMLCh>*      const enums
+                        , const int                           finalSet
+                        , MemoryManager* const                manager)
+:DateTimeValidator(baseValidator, facets, finalSet, DatatypeValidator::Month, manager)
 {
     init(enums);
 }
@@ -104,12 +108,15 @@ MonthDatatypeValidator::MonthDatatypeValidator(
 MonthDatatypeValidator::~MonthDatatypeValidator()
 {}
 
-DatatypeValidator* MonthDatatypeValidator::newInstance(
-                                      RefHashTableOf<KVStringPair>* const facets
-                                    , RefArrayVectorOf<XMLCh>*           const enums
-                                    , const int                           finalSet)
+DatatypeValidator* MonthDatatypeValidator::newInstance
+(
+      RefHashTableOf<KVStringPair>* const facets
+    , RefArrayVectorOf<XMLCh>* const      enums
+    , const int                           finalSet
+    , MemoryManager* const                manager
+)
 {
-    return (DatatypeValidator*) new MonthDatatypeValidator(this, facets, enums, finalSet);
+    return (DatatypeValidator*) new (manager) MonthDatatypeValidator(this, facets, enums, finalSet, manager);
 }
 
 //
@@ -117,7 +124,7 @@ DatatypeValidator* MonthDatatypeValidator::newInstance(
 //
 XMLDateTime* MonthDatatypeValidator::parse(const XMLCh* const content)
 {
-    XMLDateTime *pRetDate = new XMLDateTime(content);
+    XMLDateTime *pRetDate = new (fMemoryManager) XMLDateTime(content);
 
     try
     {
diff --git a/src/xercesc/validators/datatype/MonthDatatypeValidator.hpp b/src/xercesc/validators/datatype/MonthDatatypeValidator.hpp
index a70f25a55..8a1cc29af 100644
--- a/src/xercesc/validators/datatype/MonthDatatypeValidator.hpp
+++ b/src/xercesc/validators/datatype/MonthDatatypeValidator.hpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -85,28 +88,36 @@ public:
     // -----------------------------------------------------------------------
     //  Public ctor/dtor
     // -----------------------------------------------------------------------
-	/** @name Constructor. */
+	/** @name Constructors and Destructor */
     //@{
 
-    MonthDatatypeValidator();
-
-    MonthDatatypeValidator(DatatypeValidator*            const baseValidator
-                         , RefHashTableOf<KVStringPair>* const facets
-                         , RefArrayVectorOf<XMLCh>*           const enums
-                         , const int                           finalSet);
-
+    MonthDatatypeValidator
+    (
+        MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
+    MonthDatatypeValidator
+    (
+        DatatypeValidator* const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
     ~MonthDatatypeValidator();
 
-
 	//@}
 
     /**
       * Returns an instance of the base datatype validator class
 	  * Used by the DatatypeValidatorFactory.
       */
-    virtual DatatypeValidator* newInstance(RefHashTableOf<KVStringPair>* const facets
-                                         , RefArrayVectorOf<XMLCh>*           const enums
-                                         , const int                           finalSet);
+    virtual DatatypeValidator* newInstance
+    (
+        RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
 protected:
 
diff --git a/src/xercesc/validators/datatype/MonthDayDatatypeValidator.cpp b/src/xercesc/validators/datatype/MonthDayDatatypeValidator.cpp
index ba5ca7fc3..eaedba899 100644
--- a/src/xercesc/validators/datatype/MonthDayDatatypeValidator.cpp
+++ b/src/xercesc/validators/datatype/MonthDayDatatypeValidator.cpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -87,16 +90,17 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  Constructors and Destructor
 // ---------------------------------------------------------------------------
-MonthDayDatatypeValidator::MonthDayDatatypeValidator()
-:DateTimeValidator(0, 0, 0, DatatypeValidator::MonthDay)
+MonthDayDatatypeValidator::MonthDayDatatypeValidator(MemoryManager* const manager)
+:DateTimeValidator(0, 0, 0, DatatypeValidator::MonthDay, manager)
 {}
 
 MonthDayDatatypeValidator::MonthDayDatatypeValidator(
                           DatatypeValidator*            const baseValidator
                         , RefHashTableOf<KVStringPair>* const facets
-                        , RefArrayVectorOf<XMLCh>*           const enums
-                        , const int                           finalSet)
-:DateTimeValidator(baseValidator, facets, finalSet, DatatypeValidator::MonthDay)
+                        , RefArrayVectorOf<XMLCh>*      const enums
+                        , const int                           finalSet
+                        , MemoryManager* const                manager)
+:DateTimeValidator(baseValidator, facets, finalSet, DatatypeValidator::MonthDay, manager)
 {
     init(enums);
 }
@@ -104,12 +108,15 @@ MonthDayDatatypeValidator::MonthDayDatatypeValidator(
 MonthDayDatatypeValidator::~MonthDayDatatypeValidator()
 {}
 
-DatatypeValidator* MonthDayDatatypeValidator::newInstance(
-                                      RefHashTableOf<KVStringPair>* const facets
-                                    , RefArrayVectorOf<XMLCh>*           const enums
-                                    , const int                           finalSet)
+DatatypeValidator* MonthDayDatatypeValidator::newInstance
+(
+      RefHashTableOf<KVStringPair>* const facets
+    , RefArrayVectorOf<XMLCh>* const      enums
+    , const int                           finalSet
+    , MemoryManager* const                manager
+)
 {
-    return (DatatypeValidator*) new MonthDayDatatypeValidator(this, facets, enums, finalSet);
+    return (DatatypeValidator*) new (manager) MonthDayDatatypeValidator(this, facets, enums, finalSet, manager);
 }
 
 //
@@ -117,7 +124,7 @@ DatatypeValidator* MonthDayDatatypeValidator::newInstance(
 //
 XMLDateTime* MonthDayDatatypeValidator::parse(const XMLCh* const content)
 {
-    XMLDateTime *pRetDate = new XMLDateTime(content);
+    XMLDateTime *pRetDate = new (fMemoryManager) XMLDateTime(content);
 
     try
     {
diff --git a/src/xercesc/validators/datatype/MonthDayDatatypeValidator.hpp b/src/xercesc/validators/datatype/MonthDayDatatypeValidator.hpp
index 3dd63fce5..60cc9c06c 100644
--- a/src/xercesc/validators/datatype/MonthDayDatatypeValidator.hpp
+++ b/src/xercesc/validators/datatype/MonthDayDatatypeValidator.hpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -85,28 +88,36 @@ public:
     // -----------------------------------------------------------------------
     //  Public ctor/dtor
     // -----------------------------------------------------------------------
-	/** @name Constructor. */
+	/** @name Constructors and Destructor */
     //@{
 
-    MonthDayDatatypeValidator();
-
-    MonthDayDatatypeValidator(DatatypeValidator*            const baseValidator
-                            , RefHashTableOf<KVStringPair>* const facets
-                            , RefArrayVectorOf<XMLCh>*           const enums
-                            , const int                           finalSet);
-
+    MonthDayDatatypeValidator
+    (
+        MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
+    MonthDayDatatypeValidator
+    (
+        DatatypeValidator* const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
     ~MonthDayDatatypeValidator();
 
-
 	//@}
 
     /**
       * Returns an instance of the base datatype validator class
 	  * Used by the DatatypeValidatorFactory.
       */
-    virtual DatatypeValidator* newInstance(RefHashTableOf<KVStringPair>* const facets
-                                         , RefArrayVectorOf<XMLCh>*           const enums
-                                         , const int                           finalSet);
+    virtual DatatypeValidator* newInstance
+    (
+        RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
 protected:
 
diff --git a/src/xercesc/validators/datatype/NCNameDatatypeValidator.cpp b/src/xercesc/validators/datatype/NCNameDatatypeValidator.cpp
index 80ab8b26d..7a8025915 100644
--- a/src/xercesc/validators/datatype/NCNameDatatypeValidator.cpp
+++ b/src/xercesc/validators/datatype/NCNameDatatypeValidator.cpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.5  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.4  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -91,8 +94,8 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  Constructors and Destructor
 // ---------------------------------------------------------------------------
-NCNameDatatypeValidator::NCNameDatatypeValidator()
-:StringDatatypeValidator(0, 0, 0, DatatypeValidator::NCName)
+NCNameDatatypeValidator::NCNameDatatypeValidator(MemoryManager* const manager)
+:StringDatatypeValidator(0, 0, 0, DatatypeValidator::NCName, manager)
 {}
 
 NCNameDatatypeValidator::~NCNameDatatypeValidator()
@@ -101,27 +104,32 @@ NCNameDatatypeValidator::~NCNameDatatypeValidator()
 NCNameDatatypeValidator::NCNameDatatypeValidator(
                           DatatypeValidator*            const baseValidator
                         , RefHashTableOf<KVStringPair>* const facets
-                        , RefArrayVectorOf<XMLCh>*           const enums
-                        , const int                           finalSet)
-:StringDatatypeValidator(baseValidator, facets, finalSet, DatatypeValidator::NCName)
+                        , RefArrayVectorOf<XMLCh>*      const enums
+                        , const int                           finalSet
+                        , MemoryManager* const                manager)
+:StringDatatypeValidator(baseValidator, facets, finalSet, DatatypeValidator::NCName, manager)
 {
     init(enums);
 }
 
-DatatypeValidator* NCNameDatatypeValidator::newInstance(
-                                      RefHashTableOf<KVStringPair>* const facets
-                                    , RefArrayVectorOf<XMLCh>*           const enums
-                                    , const int                           finalSet)
+DatatypeValidator* NCNameDatatypeValidator::newInstance
+(
+      RefHashTableOf<KVStringPair>* const facets
+    , RefArrayVectorOf<XMLCh>* const      enums
+    , const int                           finalSet
+    , MemoryManager* const                manager
+)
 {
-    return (DatatypeValidator*) new NCNameDatatypeValidator(this, facets, enums, finalSet);
+    return (DatatypeValidator*) new (manager) NCNameDatatypeValidator(this, facets, enums, finalSet, manager);
 }
 
 NCNameDatatypeValidator::NCNameDatatypeValidator(
                           DatatypeValidator*            const baseValidator
                         , RefHashTableOf<KVStringPair>* const facets
                         , const int                           finalSet
-                        , const ValidatorType                 type)
-:StringDatatypeValidator(baseValidator, facets, finalSet, type)
+                        , const ValidatorType                 type
+                        , MemoryManager* const                manager)
+:StringDatatypeValidator(baseValidator, facets, finalSet, type, manager)
 {
     // do not invoke init() here!!!
 }
diff --git a/src/xercesc/validators/datatype/NCNameDatatypeValidator.hpp b/src/xercesc/validators/datatype/NCNameDatatypeValidator.hpp
index d09902bbf..2016c6c1e 100644
--- a/src/xercesc/validators/datatype/NCNameDatatypeValidator.hpp
+++ b/src/xercesc/validators/datatype/NCNameDatatypeValidator.hpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -91,15 +94,21 @@ public:
     // -----------------------------------------------------------------------
     //  Public ctor/dtor
     // -----------------------------------------------------------------------
-	/** @name Constructor. */
+	/** @name Constructors and Destructor */
     //@{
 
-    NCNameDatatypeValidator();
-
-    NCNameDatatypeValidator(DatatypeValidator*            const baseValidator
-                          , RefHashTableOf<KVStringPair>* const facets
-                          , RefArrayVectorOf<XMLCh>*           const enums
-                          , const int                           finalSet);
+    NCNameDatatypeValidator
+    (
+        MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
+    NCNameDatatypeValidator
+    (
+        DatatypeValidator* const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
     virtual ~NCNameDatatypeValidator();
 
@@ -144,19 +153,27 @@ public:
       * Returns an instance of the base datatype validator class
 	  * Used by the DatatypeValidatorFactory.
       */
-    virtual DatatypeValidator* newInstance(RefHashTableOf<KVStringPair>* const facets
-                                         , RefArrayVectorOf<XMLCh>*           const enums
-                                         , const int                           finalSet);
+    virtual DatatypeValidator* newInstance
+    (
+        RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
 protected:
 
     //
     // ctor provided to be used by derived classes
     //
-    NCNameDatatypeValidator(DatatypeValidator*            const baseValidator
-                          , RefHashTableOf<KVStringPair>* const facets
-                          , const int                           finalSet
-                          , const ValidatorType                 type);
+    NCNameDatatypeValidator
+    (
+        DatatypeValidator* const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , const int finalSet
+        , const ValidatorType type
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
     virtual void checkValueSpace(const XMLCh* const content);
 
diff --git a/src/xercesc/validators/datatype/NOTATIONDatatypeValidator.cpp b/src/xercesc/validators/datatype/NOTATIONDatatypeValidator.cpp
index 16215452d..92a00e9d8 100644
--- a/src/xercesc/validators/datatype/NOTATIONDatatypeValidator.cpp
+++ b/src/xercesc/validators/datatype/NOTATIONDatatypeValidator.cpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -109,8 +112,8 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  Constructors and Destructor
 // ---------------------------------------------------------------------------
-NOTATIONDatatypeValidator::NOTATIONDatatypeValidator()
-:AbstractStringValidator(0, 0, 0, DatatypeValidator::NOTATION)
+NOTATIONDatatypeValidator::NOTATIONDatatypeValidator(MemoryManager* const manager)
+:AbstractStringValidator(0, 0, 0, DatatypeValidator::NOTATION, manager)
 {}
 
 NOTATIONDatatypeValidator::~NOTATIONDatatypeValidator()
@@ -120,18 +123,22 @@ NOTATIONDatatypeValidator::NOTATIONDatatypeValidator(
                           DatatypeValidator*            const baseValidator
                         , RefHashTableOf<KVStringPair>* const facets
                         , RefArrayVectorOf<XMLCh>*           const enums
-                        , const int                           finalSet)
-:AbstractStringValidator(baseValidator, facets, finalSet, DatatypeValidator::NOTATION)
+                        , const int                           finalSet
+                        , MemoryManager* const manager)
+:AbstractStringValidator(baseValidator, facets, finalSet, DatatypeValidator::NOTATION, manager)
 {
     init(enums);
 }
 
-DatatypeValidator* NOTATIONDatatypeValidator::newInstance(
-                                      RefHashTableOf<KVStringPair>* const facets
-                                    , RefArrayVectorOf<XMLCh>*           const enums
-                                    , const int                           finalSet)
+DatatypeValidator* NOTATIONDatatypeValidator::newInstance
+(
+      RefHashTableOf<KVStringPair>* const facets
+    , RefArrayVectorOf<XMLCh>* const      enums
+    , const int                           finalSet
+    , MemoryManager* const                manager
+)
 {
-    return (DatatypeValidator*) new NOTATIONDatatypeValidator(this, facets, enums, finalSet);
+    return (DatatypeValidator*) new (manager) NOTATIONDatatypeValidator(this, facets, enums, finalSet, manager);
 }
 
 // ---------------------------------------------------------------------------
diff --git a/src/xercesc/validators/datatype/NOTATIONDatatypeValidator.hpp b/src/xercesc/validators/datatype/NOTATIONDatatypeValidator.hpp
index cfd98ab74..174ae1317 100644
--- a/src/xercesc/validators/datatype/NOTATIONDatatypeValidator.hpp
+++ b/src/xercesc/validators/datatype/NOTATIONDatatypeValidator.hpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:26  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -99,15 +102,21 @@ public:
     // -----------------------------------------------------------------------
     //  Public ctor/dtor
     // -----------------------------------------------------------------------
-	/** @name Constructor. */
+	/** @name Constructors and Destructor */
     //@{
 
-    NOTATIONDatatypeValidator();
-
-    NOTATIONDatatypeValidator(DatatypeValidator*            const baseValidator
-                            , RefHashTableOf<KVStringPair>* const facets
-                            , RefArrayVectorOf<XMLCh>*           const enums
-                            , const int                           finalSet);
+    NOTATIONDatatypeValidator
+    (
+        MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
+    NOTATIONDatatypeValidator
+    (
+        DatatypeValidator* const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
     virtual ~NOTATIONDatatypeValidator();
 
@@ -117,9 +126,13 @@ public:
       * Returns an instance of the base datatype validator class
 	  * Used by the DatatypeValidatorFactory.
       */
-    virtual DatatypeValidator* newInstance(RefHashTableOf<KVStringPair>* const facets
-                                         , RefArrayVectorOf<XMLCh>*           const enums
-                                         , const int                           finalSet);
+    virtual DatatypeValidator* newInstance
+    (
+        RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
 protected:
 
diff --git a/src/xercesc/validators/datatype/NameDatatypeValidator.cpp b/src/xercesc/validators/datatype/NameDatatypeValidator.cpp
index 18f85b97d..67ebc8490 100644
--- a/src/xercesc/validators/datatype/NameDatatypeValidator.cpp
+++ b/src/xercesc/validators/datatype/NameDatatypeValidator.cpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.5  2003/05/15 18:53:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.4  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -94,8 +97,8 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  Constructors and Destructor
 // ---------------------------------------------------------------------------
-NameDatatypeValidator::NameDatatypeValidator()
-:StringDatatypeValidator(0, 0, 0, DatatypeValidator::Name)
+NameDatatypeValidator::NameDatatypeValidator(MemoryManager* const manager)
+:StringDatatypeValidator(0, 0, 0, DatatypeValidator::Name, manager)
 {}
 
 NameDatatypeValidator::~NameDatatypeValidator()
@@ -104,27 +107,32 @@ NameDatatypeValidator::~NameDatatypeValidator()
 NameDatatypeValidator::NameDatatypeValidator(
                           DatatypeValidator*            const baseValidator
                         , RefHashTableOf<KVStringPair>* const facets
-                        , RefArrayVectorOf<XMLCh>*           const enums
-                        , const int                           finalSet)
-:StringDatatypeValidator(baseValidator, facets, finalSet, DatatypeValidator::Name)
+                        , RefArrayVectorOf<XMLCh>*      const enums
+                        , const int                           finalSet
+                        , MemoryManager* const                manager)
+:StringDatatypeValidator(baseValidator, facets, finalSet, DatatypeValidator::Name, manager)
 {
     init(enums);
 }
 
-DatatypeValidator* NameDatatypeValidator::newInstance(
-                                      RefHashTableOf<KVStringPair>* const facets
-                                    , RefArrayVectorOf<XMLCh>*           const enums
-                                    , const int                           finalSet)
+DatatypeValidator* NameDatatypeValidator::newInstance
+(
+      RefHashTableOf<KVStringPair>* const facets
+    , RefArrayVectorOf<XMLCh>* const      enums
+    , const int                           finalSet
+    , MemoryManager* const                manager
+)
 {
-    return (DatatypeValidator*) new NameDatatypeValidator(this, facets, enums, finalSet);
+    return (DatatypeValidator*) new (manager) NameDatatypeValidator(this, facets, enums, finalSet, manager);
 }
 
 NameDatatypeValidator::NameDatatypeValidator(
                           DatatypeValidator*            const baseValidator
                         , RefHashTableOf<KVStringPair>* const facets
                         , const int                           finalSet
-                        , const ValidatorType                 type)
-:StringDatatypeValidator(baseValidator, facets, finalSet, type)
+                        , const ValidatorType                 type
+                        , MemoryManager* const                manager)
+:StringDatatypeValidator(baseValidator, facets, finalSet, type, manager)
 {
     // do not invoke init() here!!!
 }
diff --git a/src/xercesc/validators/datatype/NameDatatypeValidator.hpp b/src/xercesc/validators/datatype/NameDatatypeValidator.hpp
index f98fb90b2..9cb57ea39 100644
--- a/src/xercesc/validators/datatype/NameDatatypeValidator.hpp
+++ b/src/xercesc/validators/datatype/NameDatatypeValidator.hpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -91,16 +94,21 @@ public:
     // -----------------------------------------------------------------------
     //  Public ctor/dtor
     // -----------------------------------------------------------------------
-	/** @name Constructor. */
+	/** @name Constructors and Destructor */
     //@{
 
-    NameDatatypeValidator();
-
-    NameDatatypeValidator(DatatypeValidator*            const baseValidator
-                          , RefHashTableOf<KVStringPair>* const facets
-                          , RefArrayVectorOf<XMLCh>*           const enums
-                          , const int                           finalSet);
-
+    NameDatatypeValidator
+    (
+        MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
+    NameDatatypeValidator
+    (
+        DatatypeValidator* const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
     virtual ~NameDatatypeValidator();
 
 	//@}
@@ -144,19 +152,27 @@ public:
       * Returns an instance of the base datatype validator class
 	  * Used by the DatatypeValidatorFactory.
       */
-    virtual DatatypeValidator* newInstance(RefHashTableOf<KVStringPair>* const facets
-                                         , RefArrayVectorOf<XMLCh>*           const enums
-                                         , const int                           finalSet);
+    virtual DatatypeValidator* newInstance
+    (
+        RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
 protected:
 
     //
     // ctor provided to be used by derived classes
     //
-    NameDatatypeValidator(DatatypeValidator*            const baseValidator
-                        , RefHashTableOf<KVStringPair>* const facets
-                        , const int                           finalSet
-                        , const ValidatorType                 type);
+    NameDatatypeValidator
+    (
+        DatatypeValidator* const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , const int finalSet
+        , const ValidatorType type
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
     virtual void checkValueSpace(const XMLCh* const content);
 
diff --git a/src/xercesc/validators/datatype/QNameDatatypeValidator.cpp b/src/xercesc/validators/datatype/QNameDatatypeValidator.cpp
index 604a61986..fd17e7f50 100644
--- a/src/xercesc/validators/datatype/QNameDatatypeValidator.cpp
+++ b/src/xercesc/validators/datatype/QNameDatatypeValidator.cpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -105,8 +108,8 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  Constructors and Destructor
 // ---------------------------------------------------------------------------
-QNameDatatypeValidator::QNameDatatypeValidator()
-:AbstractStringValidator(0, 0, 0, DatatypeValidator::QName)
+QNameDatatypeValidator::QNameDatatypeValidator(MemoryManager* const manager)
+:AbstractStringValidator(0, 0, 0, DatatypeValidator::QName, manager)
 {}
 
 QNameDatatypeValidator::~QNameDatatypeValidator()
@@ -115,19 +118,23 @@ QNameDatatypeValidator::~QNameDatatypeValidator()
 QNameDatatypeValidator::QNameDatatypeValidator(
                           DatatypeValidator*            const baseValidator
                         , RefHashTableOf<KVStringPair>* const facets
-                        , RefArrayVectorOf<XMLCh>*           const enums
-                        , const int                           finalSet)
-:AbstractStringValidator(baseValidator, facets, finalSet, DatatypeValidator::QName)
+                        , RefArrayVectorOf<XMLCh>*      const enums
+                        , const int                           finalSet
+                        , MemoryManager* const                manager)
+:AbstractStringValidator(baseValidator, facets, finalSet, DatatypeValidator::QName, manager)
 {
     init(enums);
 }
 
-DatatypeValidator* QNameDatatypeValidator::newInstance(
-                                      RefHashTableOf<KVStringPair>* const facets
-                                    , RefArrayVectorOf<XMLCh>*           const enums
-                                    , const int                           finalSet)
+DatatypeValidator* QNameDatatypeValidator::newInstance
+(
+      RefHashTableOf<KVStringPair>* const facets
+    , RefArrayVectorOf<XMLCh>* const      enums
+    , const int                           finalSet
+    , MemoryManager* const                manager
+)
 {
-    return (DatatypeValidator*) new QNameDatatypeValidator(this, facets, enums, finalSet);
+    return (DatatypeValidator*) new (manager) QNameDatatypeValidator(this, facets, enums, finalSet, manager);
 }
 
 // ---------------------------------------------------------------------------
diff --git a/src/xercesc/validators/datatype/QNameDatatypeValidator.hpp b/src/xercesc/validators/datatype/QNameDatatypeValidator.hpp
index a3999606d..983284683 100644
--- a/src/xercesc/validators/datatype/QNameDatatypeValidator.hpp
+++ b/src/xercesc/validators/datatype/QNameDatatypeValidator.hpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -99,16 +102,21 @@ public:
     // -----------------------------------------------------------------------
     //  Public ctor/dtor
     // -----------------------------------------------------------------------
-	/** @name Constructor. */
+	/** @name Constructors and Destructor */
     //@{
 
-    QNameDatatypeValidator();
-
-    QNameDatatypeValidator(DatatypeValidator*            const baseValidator
-                         , RefHashTableOf<KVStringPair>* const facets
-                         , RefArrayVectorOf<XMLCh>*           const enums
-                         , const int                           finalSet);
-
+    QNameDatatypeValidator
+    (
+        MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
+    QNameDatatypeValidator
+    (
+        DatatypeValidator*            const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>*           const enums
+        , const int                           finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
     virtual ~QNameDatatypeValidator();
 
 	//@}
@@ -117,9 +125,14 @@ public:
       * Returns an instance of the base datatype validator class
 	  * Used by the DatatypeValidatorFactory.
       */
-    virtual DatatypeValidator* newInstance(RefHashTableOf<KVStringPair>* const facets
-                                         , RefArrayVectorOf<XMLCh>*           const enums
-                                         , const int                           finalSet);
+    virtual DatatypeValidator* newInstance
+    (
+        RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
+
 protected:
 
     virtual void assignAdditionalFacet(const XMLCh* const key
diff --git a/src/xercesc/validators/datatype/StringDatatypeValidator.cpp b/src/xercesc/validators/datatype/StringDatatypeValidator.cpp
index 202fac889..83cbb97eb 100644
--- a/src/xercesc/validators/datatype/StringDatatypeValidator.cpp
+++ b/src/xercesc/validators/datatype/StringDatatypeValidator.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.5  2003/05/15 18:53:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.4  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -136,17 +139,18 @@ static XMLCh value2[BUF_LEN+1];
 // ---------------------------------------------------------------------------
 //  Constructors and Destructor
 // ---------------------------------------------------------------------------
-StringDatatypeValidator::StringDatatypeValidator()
-:AbstractStringValidator(0, 0, 0, DatatypeValidator::String)
+StringDatatypeValidator::StringDatatypeValidator(MemoryManager* const manager)
+:AbstractStringValidator(0, 0, 0, DatatypeValidator::String, manager)
 ,fWhiteSpace(DatatypeValidator::PRESERVE)
 {}
 
 StringDatatypeValidator::StringDatatypeValidator(
                           DatatypeValidator*            const baseValidator
                         , RefHashTableOf<KVStringPair>* const facets
-                        , RefArrayVectorOf<XMLCh>*           const enums
-                        , const int                           finalSet)
-:AbstractStringValidator(baseValidator, facets, finalSet, DatatypeValidator::String)
+                        , RefArrayVectorOf<XMLCh>*      const enums
+                        , const int                           finalSet
+                        , MemoryManager* const                manager)
+:AbstractStringValidator(baseValidator, facets, finalSet, DatatypeValidator::String, manager)
 ,fWhiteSpace(DatatypeValidator::PRESERVE)
 {
     init(enums);
@@ -155,20 +159,24 @@ StringDatatypeValidator::StringDatatypeValidator(
 StringDatatypeValidator::~StringDatatypeValidator()
 {}
 
-DatatypeValidator* StringDatatypeValidator::newInstance(
-                                      RefHashTableOf<KVStringPair>* const facets
-                                    , RefArrayVectorOf<XMLCh>*           const enums
-                                    , const int                           finalSet)
+DatatypeValidator* StringDatatypeValidator::newInstance
+(
+      RefHashTableOf<KVStringPair>* const facets
+    , RefArrayVectorOf<XMLCh>* const      enums
+    , const int                           finalSet
+    , MemoryManager* const                manager
+)
 {
-    return (DatatypeValidator*) new StringDatatypeValidator(this, facets, enums, finalSet);
+    return (DatatypeValidator*) new (manager) StringDatatypeValidator(this, facets, enums, finalSet, manager);
 }
 
 StringDatatypeValidator::StringDatatypeValidator(
                           DatatypeValidator*            const baseValidator
                         , RefHashTableOf<KVStringPair>* const facets
                         , const int                           finalSet
-                        , const ValidatorType                 type)
-:AbstractStringValidator(baseValidator, facets, finalSet, type)
+                        , const ValidatorType                 type
+                        , MemoryManager* const                manager)
+:AbstractStringValidator(baseValidator, facets, finalSet, type, manager)
 ,fWhiteSpace(DatatypeValidator::PRESERVE)
 {
     // do not invoke init() here!!!
diff --git a/src/xercesc/validators/datatype/StringDatatypeValidator.hpp b/src/xercesc/validators/datatype/StringDatatypeValidator.hpp
index 8f5f22e7e..b4b41bcba 100644
--- a/src/xercesc/validators/datatype/StringDatatypeValidator.hpp
+++ b/src/xercesc/validators/datatype/StringDatatypeValidator.hpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -97,16 +100,21 @@ public:
     // -----------------------------------------------------------------------
     //  Public ctor/dtor
     // -----------------------------------------------------------------------
-	/** @name Constructor. */
+	/** @name Constructors and Destructor */
     //@{
 
-    StringDatatypeValidator();
-
-    StringDatatypeValidator(DatatypeValidator*            const baseValidator
-                          , RefHashTableOf<KVStringPair>* const facets
-                          , RefArrayVectorOf<XMLCh>*           const enums
-                          , const int                           finalSet);
-
+    StringDatatypeValidator
+    (
+        MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
+    StringDatatypeValidator
+    (
+        DatatypeValidator* const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
     virtual ~StringDatatypeValidator();
 
 	//@}
@@ -125,19 +133,27 @@ public:
       * Returns an instance of the base datatype validator class
 	  * Used by the DatatypeValidatorFactory.
       */
-    virtual DatatypeValidator* newInstance(RefHashTableOf<KVStringPair>* const facets
-                                         , RefArrayVectorOf<XMLCh>*           const enums
-                                         , const int                           finalSet);
+    virtual DatatypeValidator* newInstance
+    (
+        RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
 protected:
 
     //
     // ctor provided to be used by derived classes
     //
-    StringDatatypeValidator(DatatypeValidator*            const baseValidator
-                          , RefHashTableOf<KVStringPair>* const facets
-                          , const int                           finalSet
-                          , const ValidatorType                 type);
+    StringDatatypeValidator
+    (
+        DatatypeValidator* const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , const int finalSet
+        , const ValidatorType type
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
     virtual void assignAdditionalFacet(const XMLCh* const key
                                      , const XMLCh* const value);
diff --git a/src/xercesc/validators/datatype/TimeDatatypeValidator.cpp b/src/xercesc/validators/datatype/TimeDatatypeValidator.cpp
index 24eb435d6..12df015f8 100644
--- a/src/xercesc/validators/datatype/TimeDatatypeValidator.cpp
+++ b/src/xercesc/validators/datatype/TimeDatatypeValidator.cpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -87,16 +90,17 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  Constructors and Destructor
 // ---------------------------------------------------------------------------
-TimeDatatypeValidator::TimeDatatypeValidator()
-:DateTimeValidator(0, 0, 0, DatatypeValidator::Time)
+TimeDatatypeValidator::TimeDatatypeValidator(MemoryManager* const manager)
+:DateTimeValidator(0, 0, 0, DatatypeValidator::Time, manager)
 {}
 
 TimeDatatypeValidator::TimeDatatypeValidator(
                           DatatypeValidator*            const baseValidator
                         , RefHashTableOf<KVStringPair>* const facets
-                        , RefArrayVectorOf<XMLCh>*           const enums
-                        , const int                           finalSet)
-:DateTimeValidator(baseValidator, facets, finalSet, DatatypeValidator::Time)
+                        , RefArrayVectorOf<XMLCh>*      const enums
+                        , const int                           finalSet
+                        , MemoryManager* const                manager)
+:DateTimeValidator(baseValidator, facets, finalSet, DatatypeValidator::Time, manager)
 {
     init(enums);
 }
@@ -104,12 +108,15 @@ TimeDatatypeValidator::TimeDatatypeValidator(
 TimeDatatypeValidator::~TimeDatatypeValidator()
 {}
 
-DatatypeValidator* TimeDatatypeValidator::newInstance(
-                                      RefHashTableOf<KVStringPair>* const facets
-                                    , RefArrayVectorOf<XMLCh>*           const enums
-                                    , const int                           finalSet)
+DatatypeValidator* TimeDatatypeValidator::newInstance
+(
+      RefHashTableOf<KVStringPair>* const facets
+    , RefArrayVectorOf<XMLCh>* const      enums
+    , const int                           finalSet
+    , MemoryManager* const                manager
+)
 {
-    return (DatatypeValidator*) new TimeDatatypeValidator(this, facets, enums, finalSet);
+    return (DatatypeValidator*) new (manager) TimeDatatypeValidator(this, facets, enums, finalSet, manager);
 }
 
 //
@@ -117,7 +124,7 @@ DatatypeValidator* TimeDatatypeValidator::newInstance(
 //
 XMLDateTime* TimeDatatypeValidator::parse(const XMLCh* const content)
 {
-    XMLDateTime *pRetDate = new XMLDateTime(content);
+    XMLDateTime *pRetDate = new (fMemoryManager) XMLDateTime(content);
 
     try
     {
diff --git a/src/xercesc/validators/datatype/TimeDatatypeValidator.hpp b/src/xercesc/validators/datatype/TimeDatatypeValidator.hpp
index fed032697..1423019e2 100644
--- a/src/xercesc/validators/datatype/TimeDatatypeValidator.hpp
+++ b/src/xercesc/validators/datatype/TimeDatatypeValidator.hpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -86,16 +89,21 @@ public:
     // -----------------------------------------------------------------------
     //  Public ctor/dtor
     // -----------------------------------------------------------------------
-	/** @name Constructor. */
+	/** @name Constructors and Destructor */
     //@{
 
-    TimeDatatypeValidator();
-
-    TimeDatatypeValidator(DatatypeValidator*            const baseValidator
-                        , RefHashTableOf<KVStringPair>* const facets
-                        , RefArrayVectorOf<XMLCh>*           const enums
-                        , const int                           finalSet);
-
+    TimeDatatypeValidator
+    (
+        MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
+    TimeDatatypeValidator
+    (
+        DatatypeValidator* const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
     ~TimeDatatypeValidator();
 
 
@@ -105,9 +113,13 @@ public:
       * Returns an instance of the base datatype validator class
 	  * Used by the DatatypeValidatorFactory.
       */
-    virtual DatatypeValidator* newInstance(RefHashTableOf<KVStringPair>* const facets
-                                         , RefArrayVectorOf<XMLCh>*           const enums
-                                         , const int                           finalSet);
+    virtual DatatypeValidator* newInstance
+    (
+        RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
 protected:
 
diff --git a/src/xercesc/validators/datatype/UnionDatatypeValidator.cpp b/src/xercesc/validators/datatype/UnionDatatypeValidator.cpp
index aab7c162f..b240388a1 100644
--- a/src/xercesc/validators/datatype/UnionDatatypeValidator.cpp
+++ b/src/xercesc/validators/datatype/UnionDatatypeValidator.cpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.9  2003/05/15 18:53:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.8  2003/02/06 13:51:55  gareth
  * fixed bug with multiple attributes being validated by the same union type.
  *
@@ -115,8 +118,8 @@ static XMLCh value2[BUF_LEN+1];
 // ---------------------------------------------------------------------------
 //  Constructors and Destructor
 // ---------------------------------------------------------------------------
-UnionDatatypeValidator::UnionDatatypeValidator()
-:DatatypeValidator(0, 0, 0, DatatypeValidator::Union)
+UnionDatatypeValidator::UnionDatatypeValidator(MemoryManager* const manager)
+:DatatypeValidator(0, 0, 0, DatatypeValidator::Union, manager)
 ,fEnumerationInherited(false)
 ,fEnumeration(0)
 ,fMemberTypeValidators(0)
@@ -130,8 +133,9 @@ UnionDatatypeValidator::~UnionDatatypeValidator()
 
 UnionDatatypeValidator::UnionDatatypeValidator(
                         RefVectorOf<DatatypeValidator>* const memberTypeValidators
-                      , const int                                         finalSet)
-:DatatypeValidator(0, 0, finalSet, DatatypeValidator::Union)
+                      , const int                             finalSet
+                      , MemoryManager* const                  manager)
+:DatatypeValidator(0, 0, finalSet, DatatypeValidator::Union, manager)
 ,fEnumerationInherited(false)
 ,fEnumeration(0)
 ,fMemberTypeValidators(0)
@@ -150,9 +154,10 @@ UnionDatatypeValidator::UnionDatatypeValidator(
 UnionDatatypeValidator::UnionDatatypeValidator(
                           DatatypeValidator*            const baseValidator
                         , RefHashTableOf<KVStringPair>* const facets
-                        , RefArrayVectorOf<XMLCh>*           const enums
-                        , const int                           finalSet)
-:DatatypeValidator(baseValidator, facets, finalSet, DatatypeValidator::Union)
+                        , RefArrayVectorOf<XMLCh>*      const enums
+                        , const int                           finalSet
+                        , MemoryManager* const                manager)
+:DatatypeValidator(baseValidator, facets, finalSet, DatatypeValidator::Union, manager)
 ,fEnumerationInherited(false)
 ,fEnumeration(0)
 ,fMemberTypeValidators(0)
@@ -339,7 +344,7 @@ void UnionDatatypeValidator::checkContent(const XMLCh* const content, bool asBas
         if (getRegex() == 0)
         {
             try {
-                setRegex(new RegularExpression(getPattern(), SchemaSymbols::fgRegEx_XOption));
+                setRegex(new (fMemoryManager) RegularExpression(getPattern(), SchemaSymbols::fgRegEx_XOption));
             }
             catch (XMLException &e)
             {
diff --git a/src/xercesc/validators/datatype/UnionDatatypeValidator.hpp b/src/xercesc/validators/datatype/UnionDatatypeValidator.hpp
index 27154a110..6a09dc92e 100644
--- a/src/xercesc/validators/datatype/UnionDatatypeValidator.hpp
+++ b/src/xercesc/validators/datatype/UnionDatatypeValidator.hpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.9  2003/05/15 18:53:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.8  2003/02/06 13:51:55  gareth
  * fixed bug with multiple attributes being validated by the same union type.
  *
@@ -112,7 +115,6 @@
 #define UNION_DATATYPEVALIDATOR_HPP
 
 #include <xercesc/validators/datatype/DatatypeValidator.hpp>
-#include <xercesc/validators/schema/SchemaSymbols.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -123,10 +125,13 @@ public:
     // -----------------------------------------------------------------------
     //  Public ctor/dtor
     // -----------------------------------------------------------------------
-	/** @name Constructor. */
+	/** @name Constructors and Destructor. */
     //@{
 
-    UnionDatatypeValidator();
+    UnionDatatypeValidator
+    (
+        MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
     //
     // constructor for native Union datatype validator
@@ -134,8 +139,12 @@ public:
     //      <union   memberTypes="member1 member2 ...">
     // </simpleType>
     //
-    UnionDatatypeValidator(RefVectorOf<DatatypeValidator>* const memberTypeValidators
-                         , const int                             finalSet);
+    UnionDatatypeValidator
+    (
+        RefVectorOf<DatatypeValidator>* const memberTypeValidators
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
     //
     // constructor for derived Union datatype validator
@@ -146,10 +155,14 @@ public:
     //      </restriction>
     // </simpleType>
     //
-    UnionDatatypeValidator(DatatypeValidator*            const baseValidator
-                         , RefHashTableOf<KVStringPair>* const facets
-                         , RefArrayVectorOf<XMLCh>*           const enums
-                         , const int                           finalSet);
+    UnionDatatypeValidator
+    (
+        DatatypeValidator* const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
     virtual ~UnionDatatypeValidator();
 
@@ -219,9 +232,13 @@ public:
       * Returns an instance of the base datatype validator class
 	  * Used by the DatatypeValidatorFactory.
       */
-    DatatypeValidator* newInstance(RefHashTableOf<KVStringPair>* const facets
-                                 , RefArrayVectorOf<XMLCh>*           const enums
-                                 , const int                           finalSet);
+    virtual DatatypeValidator* newInstance
+    (
+        RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
     RefVectorOf<DatatypeValidator>* getMemberTypeValidators() const;
 
@@ -291,12 +308,15 @@ private:
      DatatypeValidator*               fValidatedDatatype;
 };
 
-inline DatatypeValidator* UnionDatatypeValidator::newInstance(
-                                      RefHashTableOf<KVStringPair>* const facets
-                                    , RefArrayVectorOf<XMLCh>*           const enums
-                                    , const int                           finalSet)
+inline DatatypeValidator* UnionDatatypeValidator::newInstance
+(
+      RefHashTableOf<KVStringPair>* const facets
+    , RefArrayVectorOf<XMLCh>* const      enums
+    , const int                           finalSet
+    , MemoryManager* const                manager
+)
 {
-    return (DatatypeValidator*) new UnionDatatypeValidator(this, facets, enums, finalSet);
+    return (DatatypeValidator*) new (manager) UnionDatatypeValidator(this, facets, enums, finalSet, manager);
 }
 
 inline void UnionDatatypeValidator::validate( const XMLCh* const content)
diff --git a/src/xercesc/validators/datatype/YearDatatypeValidator.cpp b/src/xercesc/validators/datatype/YearDatatypeValidator.cpp
index 92e589b9b..180f5227a 100644
--- a/src/xercesc/validators/datatype/YearDatatypeValidator.cpp
+++ b/src/xercesc/validators/datatype/YearDatatypeValidator.cpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -87,16 +90,17 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  Constructors and Destructor
 // ---------------------------------------------------------------------------
-YearDatatypeValidator::YearDatatypeValidator()
-:DateTimeValidator(0, 0, 0, DatatypeValidator::Year)
+YearDatatypeValidator::YearDatatypeValidator(MemoryManager* const manager)
+:DateTimeValidator(0, 0, 0, DatatypeValidator::Year, manager)
 {}
 
 YearDatatypeValidator::YearDatatypeValidator(
                           DatatypeValidator*            const baseValidator
                         , RefHashTableOf<KVStringPair>* const facets
-                        , RefArrayVectorOf<XMLCh>*           const enums
-                        , const int                           finalSet)
-:DateTimeValidator(baseValidator, facets, finalSet, DatatypeValidator::Year)
+                        , RefArrayVectorOf<XMLCh>*      const enums
+                        , const int                           finalSet
+                        , MemoryManager* const                manager)
+:DateTimeValidator(baseValidator, facets, finalSet, DatatypeValidator::Year, manager)
 {
     init(enums);
 }
@@ -104,12 +108,15 @@ YearDatatypeValidator::YearDatatypeValidator(
 YearDatatypeValidator::~YearDatatypeValidator()
 {}
 
-DatatypeValidator* YearDatatypeValidator::newInstance(
-                                      RefHashTableOf<KVStringPair>* const facets
-                                    , RefArrayVectorOf<XMLCh>*           const enums
-                                    , const int                           finalSet)
+DatatypeValidator* YearDatatypeValidator::newInstance
+(
+      RefHashTableOf<KVStringPair>* const facets
+    , RefArrayVectorOf<XMLCh>* const      enums
+    , const int                           finalSet
+    , MemoryManager* const                manager
+)
 {
-    return (DatatypeValidator*) new YearDatatypeValidator(this, facets, enums, finalSet);
+    return (DatatypeValidator*) new (manager) YearDatatypeValidator(this, facets, enums, finalSet, manager);
 }
 
 //
@@ -117,7 +124,7 @@ DatatypeValidator* YearDatatypeValidator::newInstance(
 //
 XMLDateTime* YearDatatypeValidator::parse(const XMLCh* const content)
 {
-    XMLDateTime *pRetDate = new XMLDateTime(content);
+    XMLDateTime *pRetDate = new (fMemoryManager) XMLDateTime(content);
 
     try
     {
diff --git a/src/xercesc/validators/datatype/YearDatatypeValidator.hpp b/src/xercesc/validators/datatype/YearDatatypeValidator.hpp
index 5d94c0808..e08c6f435 100644
--- a/src/xercesc/validators/datatype/YearDatatypeValidator.hpp
+++ b/src/xercesc/validators/datatype/YearDatatypeValidator.hpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -85,28 +88,36 @@ public:
     // -----------------------------------------------------------------------
     //  Public ctor/dtor
     // -----------------------------------------------------------------------
-	/** @name Constructor. */
+	/** @name Constructors and Destructor */
     //@{
 
-    YearDatatypeValidator();
-
-    YearDatatypeValidator(DatatypeValidator*            const baseValidator
-                        , RefHashTableOf<KVStringPair>* const facets
-                        , RefArrayVectorOf<XMLCh>*           const enums
-                        , const int                           finalSet);
-
+    YearDatatypeValidator
+    (
+        MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
+    YearDatatypeValidator
+    (
+        DatatypeValidator* const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
     ~YearDatatypeValidator();
 
-
 	//@}
 
     /**
       * Returns an instance of the base datatype validator class
 	  * Used by the DatatypeValidatorFactory.
       */
-    virtual DatatypeValidator* newInstance(RefHashTableOf<KVStringPair>* const facets
-                                         , RefArrayVectorOf<XMLCh>*           const enums
-                                         , const int                           finalSet);
+    virtual DatatypeValidator* newInstance
+    (
+        RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
 protected:
 
diff --git a/src/xercesc/validators/datatype/YearMonthDatatypeValidator.cpp b/src/xercesc/validators/datatype/YearMonthDatatypeValidator.cpp
index 90a3fb271..474821c1b 100644
--- a/src/xercesc/validators/datatype/YearMonthDatatypeValidator.cpp
+++ b/src/xercesc/validators/datatype/YearMonthDatatypeValidator.cpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -87,16 +90,17 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  Constructors and Destructor
 // ---------------------------------------------------------------------------
-YearMonthDatatypeValidator::YearMonthDatatypeValidator()
-:DateTimeValidator(0, 0, 0, DatatypeValidator::YearMonth)
+YearMonthDatatypeValidator::YearMonthDatatypeValidator(MemoryManager* const manager)
+:DateTimeValidator(0, 0, 0, DatatypeValidator::YearMonth, manager)
 {}
 
 YearMonthDatatypeValidator::YearMonthDatatypeValidator(
                           DatatypeValidator*            const baseValidator
                         , RefHashTableOf<KVStringPair>* const facets
-                        , RefArrayVectorOf<XMLCh>*           const enums
-                        , const int                           finalSet)
-:DateTimeValidator(baseValidator, facets, finalSet, DatatypeValidator::YearMonth)
+                        , RefArrayVectorOf<XMLCh>*      const enums
+                        , const int                           finalSet
+                        , MemoryManager* const                manager)
+:DateTimeValidator(baseValidator, facets, finalSet, DatatypeValidator::YearMonth, manager)
 {
     init(enums);
 }
@@ -104,12 +108,15 @@ YearMonthDatatypeValidator::YearMonthDatatypeValidator(
 YearMonthDatatypeValidator::~YearMonthDatatypeValidator()
 {}
 
-DatatypeValidator* YearMonthDatatypeValidator::newInstance(
-                                      RefHashTableOf<KVStringPair>* const facets
-                                    , RefArrayVectorOf<XMLCh>*           const enums
-                                    , const int                           finalSet)
+DatatypeValidator* YearMonthDatatypeValidator::newInstance
+(
+      RefHashTableOf<KVStringPair>* const facets
+    , RefArrayVectorOf<XMLCh>* const      enums
+    , const int                           finalSet
+    , MemoryManager* const                manager
+)
 {
-    return (DatatypeValidator*) new YearMonthDatatypeValidator(this, facets, enums, finalSet);
+    return (DatatypeValidator*) new (manager) YearMonthDatatypeValidator(this, facets, enums, finalSet, manager);
 }
 
 //
@@ -117,7 +124,7 @@ DatatypeValidator* YearMonthDatatypeValidator::newInstance(
 //
 XMLDateTime* YearMonthDatatypeValidator::parse(const XMLCh* const content)
 {
-    XMLDateTime *pRetDate = new XMLDateTime(content);
+    XMLDateTime *pRetDate = new (fMemoryManager) XMLDateTime(content);
 
     try
     {
diff --git a/src/xercesc/validators/datatype/YearMonthDatatypeValidator.hpp b/src/xercesc/validators/datatype/YearMonthDatatypeValidator.hpp
index 39e0939bb..81d9d8544 100644
--- a/src/xercesc/validators/datatype/YearMonthDatatypeValidator.hpp
+++ b/src/xercesc/validators/datatype/YearMonthDatatypeValidator.hpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.4  2003/05/15 18:53:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:55  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -85,28 +88,36 @@ public:
     // -----------------------------------------------------------------------
     //  Public ctor/dtor
     // -----------------------------------------------------------------------
-	/** @name Constructor. */
+	/** @name Constructors and Destructor */
     //@{
 
-    YearMonthDatatypeValidator();
-
-    YearMonthDatatypeValidator(DatatypeValidator*            const baseValidator
-                             , RefHashTableOf<KVStringPair>* const facets
-                             , RefArrayVectorOf<XMLCh>*           const enums
-                             , const int                           finalSet);
-
+    YearMonthDatatypeValidator
+    (
+        MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
+    YearMonthDatatypeValidator
+    (
+        DatatypeValidator* const baseValidator
+        , RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
     ~YearMonthDatatypeValidator();
 
-
 	//@}
 
     /**
       * Returns an instance of the base datatype validator class
 	  * Used by the DatatypeValidatorFactory.
       */
-    virtual DatatypeValidator* newInstance(RefHashTableOf<KVStringPair>* const facets
-                                         , RefArrayVectorOf<XMLCh>*           const enums
-                                         , const int                           finalSet);
+    virtual DatatypeValidator* newInstance
+    (
+        RefHashTableOf<KVStringPair>* const facets
+        , RefArrayVectorOf<XMLCh>* const enums
+        , const int finalSet
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
 protected:
 
diff --git a/src/xercesc/validators/schema/ComplexTypeInfo.cpp b/src/xercesc/validators/schema/ComplexTypeInfo.cpp
index 680b74ebd..b105c67b6 100644
--- a/src/xercesc/validators/schema/ComplexTypeInfo.cpp
+++ b/src/xercesc/validators/schema/ComplexTypeInfo.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.7  2003/05/15 18:57:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.6  2003/01/29 19:57:30  gareth
  * API to retrive local and uri part of the type name
  *
@@ -176,8 +179,9 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  ComplexTypeInfo: Constructors and Destructor
 // ---------------------------------------------------------------------------
-ComplexTypeInfo::ComplexTypeInfo()
-    : fAbstract(false)
+ComplexTypeInfo::ComplexTypeInfo(MemoryManager* const manager)
+    : fAnonymous(false)
+    , fAbstract(false)
     , fAdoptContentSpec(true)
     , fAttWithTypeId(false)
     , fPreprocessed(false)
@@ -205,7 +209,7 @@ ComplexTypeInfo::ComplexTypeInfo()
     , fContentSpecOrgURISize(16)
     , fSpecNodesToDelete(0)
     , fLocator(0)
-    , fAnonymous(false)
+    , fMemoryManager(manager)
 {
 
 }
@@ -213,9 +217,9 @@ ComplexTypeInfo::ComplexTypeInfo()
 
 ComplexTypeInfo::~ComplexTypeInfo()
 {
-    delete [] fTypeName;
-    delete [] fTypeLocalName;
-    delete [] fTypeUri;
+    fMemoryManager->deallocate(fTypeName); //delete [] fTypeName;
+    fMemoryManager->deallocate(fTypeLocalName); //delete [] fTypeLocalName;
+    fMemoryManager->deallocate(fTypeUri); //delete [] fTypeUri;
 
     if (fAdoptContentSpec) {
         delete fContentSpec;
@@ -229,8 +233,8 @@ ComplexTypeInfo::~ComplexTypeInfo()
     delete fLocator;
 
     delete fContentModel;
-    delete [] fFormattedModel;
-    delete [] fContentSpecOrgURI;
+    fMemoryManager->deallocate(fFormattedModel); //delete [] fFormattedModel;
+    fMemoryManager->deallocate(fContentSpecOrgURI); //delete [] fContentSpecOrgURI;
 }
 
 // ---------------------------------------------------------------------------
@@ -326,7 +330,7 @@ XMLAttDef* ComplexTypeInfo::findAttr(const XMLCh* const qName
             faultInAttDefList();
 
         // And add a default attribute for this name
-        retVal = new SchemaAttDef(prefix, baseName, uriId);
+        retVal = new (fMemoryManager) SchemaAttDef(prefix, baseName, uriId);
         retVal->setElemId(getElementId());
         fAttDefs->put((void*)retVal->getAttName()->getLocalPart(), uriId, retVal);
 
@@ -364,7 +368,7 @@ void ComplexTypeInfo::checkUniqueParticleAttribution (SchemaGrammar*    const pG
                                                       XMLValidator*     const pValidator)
 {
     if (fContentSpec) {
-        ContentSpecNode* specNode = new ContentSpecNode(*fContentSpec);
+        ContentSpecNode* specNode = new (fMemoryManager) ContentSpecNode(*fContentSpec);
         XMLContentModel* cm = makeContentModel(true, specNode);
 
         if (cm) {
@@ -383,7 +387,7 @@ void ComplexTypeInfo::faultInAttDefList() const
 {
     // Use a hash modulus of 29 and tell it owns its elements
     ((ComplexTypeInfo*)this)->fAttDefs =
-                    new RefHash2KeysTableOf<SchemaAttDef>(29, true);
+                    new (fMemoryManager) RefHash2KeysTableOf<SchemaAttDef>(29, true);
 }
 
 XMLCh* ComplexTypeInfo::formatContentModel() const
@@ -391,13 +395,13 @@ XMLCh* ComplexTypeInfo::formatContentModel() const
     XMLCh* newValue = 0;
     if (fContentType == SchemaElementDecl::Any)
     {
-        newValue = XMLString::replicate(XMLUni::fgAnyString);
+        newValue = XMLString::replicate(XMLUni::fgAnyString, fMemoryManager);
     }
-     else if (fContentType == SchemaElementDecl::Empty)
+    else if (fContentType == SchemaElementDecl::Empty)
     {
-        newValue = XMLString::replicate(XMLUni::fgEmptyString);
+        newValue = XMLString::replicate(XMLUni::fgEmptyString, fMemoryManager);
     }
-     else
+    else
     {
         //
         //  Use a temp XML buffer to format into. Content models could be
@@ -409,9 +413,12 @@ XMLCh* ComplexTypeInfo::formatContentModel() const
         if (specNode) {
             XMLBuffer bufFmt;
 
-
             specNode->formatSpec(bufFmt);
-            newValue = XMLString::replicate(bufFmt.getRawBuffer());
+            newValue = XMLString::replicate
+            (
+                bufFmt.getRawBuffer()
+                , fMemoryManager
+            );
         }
     }
     return newValue;
@@ -420,14 +427,17 @@ XMLCh* ComplexTypeInfo::formatContentModel() const
 XMLContentModel* ComplexTypeInfo::makeContentModel(const bool checkUPA, ContentSpecNode* const specNode)
 {
     if ((specNode || fContentSpec) && !fSpecNodesToDelete) {
-        fSpecNodesToDelete = new RefVectorOf<ContentSpecNode>(8);
+        fSpecNodesToDelete = new (fMemoryManager) RefVectorOf<ContentSpecNode>(8);
     }
 
     // expand the content spec first
     ContentSpecNode* aSpecNode = specNode;
     if (aSpecNode) {
 
-        fContentSpecOrgURI = new unsigned int[fContentSpecOrgURISize];
+        fContentSpecOrgURI = (unsigned int*) fMemoryManager->allocate
+        (
+            fContentSpecOrgURISize * sizeof(unsigned int)
+        ); //new unsigned int[fContentSpecOrgURISize];
         aSpecNode = convertContentSpecTree(aSpecNode, checkUPA);
         fSpecNodesToDelete->addElement(aSpecNode);
     }
@@ -454,7 +464,7 @@ XMLContentModel* ComplexTypeInfo::makeContentModel(const bool checkUPA, ContentS
         //  Just create a mixel content model object. This type of
         //  content model is optimized for mixed content validation.
         //
-        cmRet = new MixedContentModel(false, aSpecNode);
+        cmRet = new (fMemoryManager) MixedContentModel(false, aSpecNode);
     }
     else if (fContentType == SchemaElementDecl::Mixed_Complex) {
 
@@ -514,12 +524,12 @@ XMLContentModel* ComplexTypeInfo::createChildModel(ContentSpecNode* specNode, co
             // All the nodes under an ALL must be additional ALL nodes and
             // ELEMENTs (or ELEMENTs under ZERO_OR_ONE nodes.)
             // We collapse the ELEMENTs into a single vector.
-            return new AllContentModel(specNode, true);
+            return new (fMemoryManager) AllContentModel(specNode, true, fMemoryManager);
         }
         else if (specType == ContentSpecNode::ZeroOrOne) {
             // An ALL node can appear under a ZERO_OR_ONE node.
             if (specNode->getFirst()->getType() == ContentSpecNode::All) {
-                return new AllContentModel(specNode->getFirst(), true);
+                return new (fMemoryManager) AllContentModel(specNode->getFirst(), true, fMemoryManager);
             }
         }
 
@@ -528,7 +538,7 @@ XMLContentModel* ComplexTypeInfo::createChildModel(ContentSpecNode* specNode, co
      else if (specType == ContentSpecNode::Leaf)
     {
         // Create a simple content model
-        return new SimpleContentModel
+        return new (fMemoryManager) SimpleContentModel
         (
             false
             , specNode->getElement()
@@ -547,7 +557,7 @@ XMLContentModel* ComplexTypeInfo::createChildModel(ContentSpecNode* specNode, co
         &&  (specNode->getSecond())
         &&  (specNode->getSecond()->getType() == ContentSpecNode::Leaf))
         {
-            return new SimpleContentModel
+            return new (fMemoryManager) SimpleContentModel
             (
                 false
                 , specNode->getFirst()->getElement()
@@ -567,7 +577,7 @@ XMLContentModel* ComplexTypeInfo::createChildModel(ContentSpecNode* specNode, co
         //
         if (specNode->getFirst()->getType() == ContentSpecNode::Leaf)
         {
-            return new SimpleContentModel
+            return new (fMemoryManager) SimpleContentModel
             (
                 false
                 , specNode->getFirst()->getElement()
@@ -576,11 +586,11 @@ XMLContentModel* ComplexTypeInfo::createChildModel(ContentSpecNode* specNode, co
             );
         }
         else if (specNode->getFirst()->getType() == ContentSpecNode::All)
-            return new AllContentModel(specNode->getFirst(), false);
+            return new (fMemoryManager) AllContentModel(specNode->getFirst(), false, fMemoryManager);
 
     }
     else if (specType == ContentSpecNode::All)
-        return new AllContentModel(specNode, false);
+        return new (fMemoryManager) AllContentModel(specNode, false, fMemoryManager);
 
     else
     {
@@ -588,7 +598,7 @@ XMLContentModel* ComplexTypeInfo::createChildModel(ContentSpecNode* specNode, co
     }
 
     // Its not any simple type of content, so create a DFA based content model
-    return new DFAContentModel(false, specNode, isMixed);
+    return new (fMemoryManager) DFAContentModel(false, specNode, isMixed, fMemoryManager);
 }
 
 ContentSpecNode*
@@ -677,20 +687,20 @@ ContentSpecNode* ComplexTypeInfo::expandContentModel(ContentSpecNode* const spec
     }
     else if (minOccurs == 0 && maxOccurs == 1) {
 
-        retNode = new ContentSpecNode(ContentSpecNode::ZeroOrOne, retNode, 0);
+        retNode = new (fMemoryManager) ContentSpecNode(ContentSpecNode::ZeroOrOne, retNode, 0);
     }
     else if (minOccurs == 0 && maxOccurs == -1) {
-        retNode = new ContentSpecNode(ContentSpecNode::ZeroOrMore, retNode, 0);
+        retNode = new (fMemoryManager) ContentSpecNode(ContentSpecNode::ZeroOrMore, retNode, 0);
     }
     else if (minOccurs == 1 && maxOccurs == -1) {
-        retNode = new ContentSpecNode(ContentSpecNode::OneOrMore, retNode, 0);
+        retNode = new (fMemoryManager) ContentSpecNode(ContentSpecNode::OneOrMore, retNode, 0);
     }
     else if (maxOccurs == -1) {
 
-        retNode = new ContentSpecNode(ContentSpecNode::OneOrMore, retNode, 0);
+        retNode = new (fMemoryManager) ContentSpecNode(ContentSpecNode::OneOrMore, retNode, 0);
 
         for (int i=0; i < (int)(minOccurs-1); i++) {
-            retNode = new ContentSpecNode(ContentSpecNode::Sequence,
+            retNode = new (fMemoryManager) ContentSpecNode(ContentSpecNode::Sequence,
                                           saveNode, retNode, false);
         }
     }
@@ -699,12 +709,12 @@ ContentSpecNode* ComplexTypeInfo::expandContentModel(ContentSpecNode* const spec
         if (minOccurs == 0) {
 
             ContentSpecNode* optional =
-                new ContentSpecNode(ContentSpecNode::ZeroOrOne, saveNode, 0);
+                new (fMemoryManager) ContentSpecNode(ContentSpecNode::ZeroOrOne, saveNode, 0);
 
             retNode = optional;
 
             for (int i=0; i < (int)(maxOccurs-minOccurs-1); i++) {
-                retNode = new ContentSpecNode(ContentSpecNode::Sequence,
+                retNode = new (fMemoryManager) ContentSpecNode(ContentSpecNode::Sequence,
                                               retNode, optional, true, false);
             }
         }
@@ -712,11 +722,11 @@ ContentSpecNode* ComplexTypeInfo::expandContentModel(ContentSpecNode* const spec
 
             if (minOccurs > 1) {
 
-                retNode = new ContentSpecNode(ContentSpecNode::Sequence,
+                retNode = new (fMemoryManager) ContentSpecNode(ContentSpecNode::Sequence,
                                               retNode, saveNode, true, false);
 
                 for (int i=1; i < (int)(minOccurs-1); i++) {
-                    retNode = new ContentSpecNode(ContentSpecNode::Sequence,
+                    retNode = new (fMemoryManager) ContentSpecNode(ContentSpecNode::Sequence,
                                                   retNode, saveNode, true, false);
                 }
             }
@@ -725,13 +735,13 @@ ContentSpecNode* ComplexTypeInfo::expandContentModel(ContentSpecNode* const spec
 
             if (counter > 0) {
 
-                ContentSpecNode* optional = new ContentSpecNode(ContentSpecNode::ZeroOrOne, saveNode, 0, false);
+                ContentSpecNode* optional = new (fMemoryManager) ContentSpecNode(ContentSpecNode::ZeroOrOne, saveNode, 0, false);
 
-                retNode = new ContentSpecNode(ContentSpecNode::Sequence, retNode, optional);
+                retNode = new (fMemoryManager) ContentSpecNode(ContentSpecNode::Sequence, retNode, optional);
 
                 for (int j=1; j < counter; j++) {
 
-                    retNode = new ContentSpecNode(ContentSpecNode::Sequence,
+                    retNode = new (fMemoryManager) ContentSpecNode(ContentSpecNode::Sequence,
 					                              retNode, optional, true, false);
                 }
             }
@@ -744,7 +754,10 @@ ContentSpecNode* ComplexTypeInfo::expandContentModel(ContentSpecNode* const spec
 void ComplexTypeInfo::resizeContentSpecOrgURI() {
 
     unsigned int newSize = fContentSpecOrgURISize * 2;
-    unsigned int* newContentSpecOrgURI = new unsigned int[newSize];
+    unsigned int* newContentSpecOrgURI = (unsigned int*) fMemoryManager->allocate
+    (
+        newSize * sizeof(unsigned int)
+    ); //new unsigned int[newSize];
 
     // Copy the existing values
     unsigned int index = 0;
@@ -755,7 +768,7 @@ void ComplexTypeInfo::resizeContentSpecOrgURI() {
         newContentSpecOrgURI[index] = 0;
 
     // Delete the old array and udpate our members
-    delete [] fContentSpecOrgURI;
+    fMemoryManager->deallocate(fContentSpecOrgURI); //delete [] fContentSpecOrgURI;
     fContentSpecOrgURI = newContentSpecOrgURI;
     fContentSpecOrgURISize = newSize;
 }
diff --git a/src/xercesc/validators/schema/ComplexTypeInfo.hpp b/src/xercesc/validators/schema/ComplexTypeInfo.hpp
index 884b6b9f3..9490922c4 100644
--- a/src/xercesc/validators/schema/ComplexTypeInfo.hpp
+++ b/src/xercesc/validators/schema/ComplexTypeInfo.hpp
@@ -74,7 +74,6 @@
 #include <xercesc/util/XMLString.hpp>
 #include <xercesc/util/RefHash2KeysTableOf.hpp>
 #include <xercesc/util/RefVectorOf.hpp>
-#include <xercesc/util/Janitor.hpp>
 #include <xercesc/framework/XMLElementDecl.hpp>
 #include <xercesc/framework/XMLContentModel.hpp>
 #include <xercesc/validators/schema/SchemaAttDef.hpp>
@@ -92,13 +91,13 @@ class SchemaElementDecl;
 class XSDLocator;
 
 
-class VALIDATORS_EXPORT ComplexTypeInfo
+class VALIDATORS_EXPORT ComplexTypeInfo : public XMemory
 {
 public:
     // -----------------------------------------------------------------------
     //  Public Constructors/Destructor
     // -----------------------------------------------------------------------
-    ComplexTypeInfo();
+    ComplexTypeInfo(MemoryManager* const manager);
     ~ComplexTypeInfo();
 
     // -----------------------------------------------------------------------
@@ -213,6 +212,7 @@ private:
     // -----------------------------------------------------------------------
     //  Private data members
     // -----------------------------------------------------------------------
+    bool                               fAnonymous;
     bool                               fAbstract;
     bool                               fAdoptContentSpec;
     bool                               fAttWithTypeId;
@@ -241,7 +241,7 @@ private:
     unsigned int                       fUniqueURI;
     unsigned int                       fContentSpecOrgURISize;
     XSDLocator*                        fLocator;
-    bool                               fAnonymous;
+    MemoryManager*                     fMemoryManager;
 };
 
 // ---------------------------------------------------------------------------
@@ -402,7 +402,10 @@ inline const XMLCh* ComplexTypeInfo::getTypeLocalName() const
     if(!fTypeLocalName) {
         int index = XMLString::indexOf(fTypeName, chComma);
         int length = XMLString::stringLen(fTypeName);
-        XMLCh *tName = new XMLCh[length - index + 1];
+        XMLCh *tName = (XMLCh*) fMemoryManager->allocate
+        (
+            (length - index + 1) * sizeof(XMLCh)
+        ); //new XMLCh[length - index + 1];
         XMLString::subString(tName, fTypeName, index + 1, length);
         ((ComplexTypeInfo *)this)->fTypeLocalName = tName;
     }
@@ -414,7 +417,10 @@ inline const XMLCh* ComplexTypeInfo::getTypeUri() const
 {
     if(!fTypeUri) {
         int index = XMLString::indexOf(fTypeName, chComma);
-        XMLCh *uri = new XMLCh[index + 1];
+        XMLCh *uri = (XMLCh*) fMemoryManager->allocate
+        (
+            (index + 1) * sizeof(XMLCh)
+        ); //new XMLCh[index + 1];
         XMLString::subString(uri, fTypeName, 0, index);
         ((ComplexTypeInfo *)this)->fTypeUri = uri;
     }
@@ -478,13 +484,12 @@ ComplexTypeInfo::setContentType(const int contentType) {
 
 inline void ComplexTypeInfo::setTypeName(const XMLCh* const typeName) {
 
-    delete [] fTypeName;
-    delete [] fTypeLocalName;
-    fTypeLocalName = 0;
-    delete [] fTypeUri;
-    fTypeUri = 0;
+    fMemoryManager->deallocate(fTypeName);//delete [] fTypeName;
+    fMemoryManager->deallocate(fTypeLocalName);//delete [] fTypeLocalName;
+    fMemoryManager->deallocate(fTypeUri);//delete [] fTypeUri;
+    fTypeLocalName = fTypeUri = 0;
 
-    fTypeName = XMLString::replicate(typeName);
+    fTypeName = XMLString::replicate(typeName, fMemoryManager);
 }
 
 inline void
@@ -508,7 +513,7 @@ ComplexTypeInfo::setBaseComplexTypeInfo(ComplexTypeInfo* const typeInfo) {
 inline void ComplexTypeInfo::addElement(SchemaElementDecl* const elem) {
 
     if (!fElements) {
-        fElements = new RefVectorOf<SchemaElementDecl>(8, false);
+        fElements = new (fMemoryManager) RefVectorOf<SchemaElementDecl>(8, false);
     }
     else if (fElements->containsElement(elem)) {
         return;
diff --git a/src/xercesc/validators/schema/GeneralAttributeCheck.cpp b/src/xercesc/validators/schema/GeneralAttributeCheck.cpp
index c095bc4e5..767bd2fd7 100644
--- a/src/xercesc/validators/schema/GeneralAttributeCheck.cpp
+++ b/src/xercesc/validators/schema/GeneralAttributeCheck.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.13  2003/05/15 18:57:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.12  2003/01/17 15:35:57  knoaman
  * Fix for attribute checking of schema declarations.
  *
@@ -211,8 +214,10 @@ static XMLRegisterCleanup GeneralAttCheckCleanup;
 // ---------------------------------------------------------------------------
 //  GeneralAttributeCheck: Constructors and Destructor
 // ---------------------------------------------------------------------------
-GeneralAttributeCheck::GeneralAttributeCheck()
-    : fIDRefList(0)
+GeneralAttributeCheck::GeneralAttributeCheck(MemoryManager* const manager)
+    : fMemoryManager(manager)
+    , fIDRefList(0)
+    , fIDValidator(manager)
 {
     mapElements();
 }
@@ -227,7 +232,7 @@ GeneralAttributeCheck::~GeneralAttributeCheck()
 // ---------------------------------------------------------------------------
 void GeneralAttributeCheck::setUpValidators() {
 
-    DatatypeValidatorFactory dvFactory;
+    DatatypeValidatorFactory dvFactory(fMemoryManager);
 
     dvFactory.expandRegistryToFullSchemaSet();
     fNonNegIntDV = dvFactory.getDatatypeValidator(SchemaSymbols::fgDT_NONNEGATIVEINTEGER);
diff --git a/src/xercesc/validators/schema/GeneralAttributeCheck.hpp b/src/xercesc/validators/schema/GeneralAttributeCheck.hpp
index 9401b334a..95f8fcc22 100644
--- a/src/xercesc/validators/schema/GeneralAttributeCheck.hpp
+++ b/src/xercesc/validators/schema/GeneralAttributeCheck.hpp
@@ -69,11 +69,9 @@
 // ---------------------------------------------------------------------------
 //  Includes
 // ---------------------------------------------------------------------------
-#include <xercesc/util/RefVectorOf.hpp>
 #include <xercesc/util/RefHashTableOf.hpp>
-#include <xercesc/util/RefHash2KeysTableOf.hpp>
-#include <xercesc/validators/datatype/IDDatatypeValidator.hpp>
 #include <xercesc/util/ValueHashTableOf.hpp>
+#include <xercesc/validators/datatype/IDDatatypeValidator.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -84,7 +82,7 @@ class TraverseSchema;
 class DOMElement;
 
 
-class VALIDATORS_EXPORT GeneralAttributeCheck
+class VALIDATORS_EXPORT GeneralAttributeCheck : public XMemory
 {
 public:
     // -----------------------------------------------------------------------
@@ -219,7 +217,7 @@ public:
     // -----------------------------------------------------------------------
     //  Constructor/Destructor
     // -----------------------------------------------------------------------
-    GeneralAttributeCheck();
+    GeneralAttributeCheck(MemoryManager* const manager);
     ~GeneralAttributeCheck();
 
     // -----------------------------------------------------------------------
@@ -285,8 +283,9 @@ private:
     static DatatypeValidator*                fAnyURIDV;
     static unsigned short                    fgElemAttTable[E_Count][A_Count];
     static const XMLCh*                      fAttNames[A_Count];
-    IDDatatypeValidator                      fIDValidator;
+    MemoryManager*                           fMemoryManager;
     RefHashTableOf<XMLRefInfo>*              fIDRefList;
+    IDDatatypeValidator                      fIDValidator;
 };
 
 
diff --git a/src/xercesc/validators/schema/NamespaceScope.cpp b/src/xercesc/validators/schema/NamespaceScope.cpp
index ce9f7f67e..7c5ce40ae 100644
--- a/src/xercesc/validators/schema/NamespaceScope.cpp
+++ b/src/xercesc/validators/schema/NamespaceScope.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.3  2003/05/15 18:57:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.2  2002/11/04 14:49:41  tng
  * C++ Namespace Support.
  *
@@ -91,9 +94,13 @@ NamespaceScope::NamespaceScope() :
     , fStackCapacity(8)
     , fStackTop(0)
     , fStack(0)
+    , fMemoryManager(XMLPlatformUtils::fgMemoryManager)
 {
     // Do an initial allocation of the stack and zero it out
-    fStack = new StackElem*[fStackCapacity];
+    fStack = (StackElem**) fMemoryManager->allocate
+    (
+        fStackCapacity * sizeof(StackElem*)
+    );//new StackElem*[fStackCapacity];
     memset(fStack, 0, fStackCapacity * sizeof(StackElem*));
 }
 
@@ -110,12 +117,12 @@ NamespaceScope::~NamespaceScope()
             break;
 
         // Delete the row for this entry, then delete the row structure
-        delete [] fStack[stackInd]->fMap;
+        fMemoryManager->deallocate(fStack[stackInd]->fMap);//delete [] fStack[stackInd]->fMap;
         delete fStack[stackInd];
     }
 
     // Delete the stack array itself now
-    delete [] fStack;
+    fMemoryManager->deallocate(fStack);//delete [] fStack;
 }
 
 
@@ -131,7 +138,7 @@ unsigned int NamespaceScope::increaseDepth()
     // If this element has not been initialized yet, then initialize it
     if (!fStack[fStackTop])
     {
-        fStack[fStackTop] = new StackElem;
+        fStack[fStackTop] = new (fMemoryManager) StackElem;
         fStack[fStackTop]->fMapCapacity = 0;
         fStack[fStackTop]->fMap = 0;
     }
@@ -258,7 +265,10 @@ void NamespaceScope::expandMap(StackElem* const toExpand)
     //
     const unsigned int newCapacity = oldCap ?
                                      (unsigned int)(oldCap * 1.25) : 16;
-    PrefMapElem* newMap = new PrefMapElem[newCapacity];
+    PrefMapElem* newMap = (PrefMapElem*) fMemoryManager->allocate
+    (
+        newCapacity * sizeof(PrefMapElem)
+    );//new PrefMapElem[newCapacity];
 
     //
     //  Copy over the old stuff. We DON'T have to zero out the new stuff
@@ -268,7 +278,7 @@ void NamespaceScope::expandMap(StackElem* const toExpand)
     memcpy(newMap, toExpand->fMap, oldCap * sizeof(PrefMapElem));
 
     // Delete the old map and store the new stuff
-    delete [] toExpand->fMap;
+    fMemoryManager->deallocate(toExpand->fMap);//delete [] toExpand->fMap;
     toExpand->fMap = newMap;
     toExpand->fMapCapacity = newCapacity;
 }
@@ -277,7 +287,10 @@ void NamespaceScope::expandStack()
 {
     // Expand the capacity by 25% and allocate a new buffer
     const unsigned int newCapacity = (unsigned int)(fStackCapacity * 1.25);
-    StackElem** newStack = new StackElem*[newCapacity];
+    StackElem** newStack = (StackElem**) fMemoryManager->allocate
+    (
+        newCapacity * sizeof(StackElem*)
+    );//new StackElem*[newCapacity];
 
     // Copy over the old stuff
     memcpy(newStack, fStack, fStackCapacity * sizeof(StackElem*));
@@ -295,7 +308,7 @@ void NamespaceScope::expandStack()
     );
 
     // Delete the old array and update our members
-    delete [] fStack;
+    fMemoryManager->deallocate(fStack);//delete [] fStack;
     fStack = newStack;
     fStackCapacity = newCapacity;
 }
diff --git a/src/xercesc/validators/schema/NamespaceScope.hpp b/src/xercesc/validators/schema/NamespaceScope.hpp
index 0c5228e50..c208c401a 100644
--- a/src/xercesc/validators/schema/NamespaceScope.hpp
+++ b/src/xercesc/validators/schema/NamespaceScope.hpp
@@ -61,7 +61,6 @@
 #if !defined(NAMESPACESCOPE_HPP)
 #define NAMESPACESCOPE_HPP
 
-#include <xercesc/util/XercesDefs.hpp>
 #include <xercesc/util/StringPool.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
@@ -72,7 +71,7 @@ XERCES_CPP_NAMESPACE_BEGIN
 // at a particular instant in time.
 //
 
-class VALIDATORS_EXPORT NamespaceScope
+class VALIDATORS_EXPORT NamespaceScope : public XMemory
 {
 public :
     // -----------------------------------------------------------------------
@@ -90,13 +89,13 @@ public :
     //      The fMapCapacity is how large fMap has grown so far. fMapCount
     //      is how many of them are valid right now.
     // -----------------------------------------------------------------------
-    struct PrefMapElem
+    struct PrefMapElem : public XMemory
     {
         unsigned int        fPrefId;
         unsigned int        fURIId;
     };
 
-    struct StackElem
+    struct StackElem : public XMemory
     {
         PrefMapElem*        fMap;
         unsigned int        fMapCapacity;
@@ -174,6 +173,7 @@ private :
     unsigned int  fStackTop;
     XMLStringPool fPrefixPool;
     StackElem**   fStack;
+    MemoryManager* fMemoryManager;
 };
 
 
diff --git a/src/xercesc/validators/schema/SchemaElementDecl.cpp b/src/xercesc/validators/schema/SchemaElementDecl.cpp
index 339d1fd4d..47d55d5ef 100644
--- a/src/xercesc/validators/schema/SchemaElementDecl.cpp
+++ b/src/xercesc/validators/schema/SchemaElementDecl.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.8  2003/05/15 18:57:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.7  2003/01/29 19:47:16  gareth
  * added DOMTypeInfo and some PSVI methods
  *
@@ -151,9 +154,9 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  SchemaElementDecl: Constructors and Destructor
 // ---------------------------------------------------------------------------
-SchemaElementDecl::SchemaElementDecl() :
-
-    fModelType(Any)
+SchemaElementDecl::SchemaElementDecl(MemoryManager* const manager) :
+    XMLElementDecl(manager)
+    , fModelType(Any)
     , fDatatypeValidator(0)
     , fEnclosingScope(Grammar::TOP_LEVEL_SCOPE)
     , fBlockSet(0)
@@ -180,8 +183,9 @@ SchemaElementDecl::SchemaElementDecl(const XMLCh* const                  prefix
                                    , const int                           uriId
                                    , const SchemaElementDecl::ModelTypes type
                                    , const int                           enclosingScope
-                                   ) :
-    fModelType(type)
+                                   , MemoryManager* const                manager) :
+    XMLElementDecl(manager)
+    , fModelType(type)
     , fDatatypeValidator(0)
     , fEnclosingScope(enclosingScope)
     , fBlockSet(0)
@@ -207,8 +211,9 @@ SchemaElementDecl::SchemaElementDecl(const XMLCh* const                  prefix
 SchemaElementDecl::SchemaElementDecl(const QName* const                  elementName
                                    , const SchemaElementDecl::ModelTypes type
                                    , const int                           enclosingScope
-                                   ) :
-    fModelType(type)
+                                   , MemoryManager* const                manager) :
+    XMLElementDecl(manager)
+    , fModelType(type)
     , fDatatypeValidator(0)
     , fEnclosingScope(enclosingScope)
     , fBlockSet(0)
@@ -233,7 +238,7 @@ SchemaElementDecl::SchemaElementDecl(const QName* const                  element
 
 SchemaElementDecl::~SchemaElementDecl()
 {
-    delete [] fDefaultValue;
+    getMemoryManager()->deallocate(fDefaultValue);//delete [] fDefaultValue;
     delete fAttDefs;
     delete fIdentityConstraints;
     delete fAttWildCard;
@@ -263,7 +268,7 @@ XMLAttDef* SchemaElementDecl::findAttr(const XMLCh* const    qName
             // If no att list exist yet, then create one
             if (!fAttDefs) {
                 // Use a hash modulus of 29 and tell it owns its elements
-                ((SchemaElementDecl*)this)->fAttDefs = new RefHash2KeysTableOf<SchemaAttDef>(29, true);
+                ((SchemaElementDecl*)this)->fAttDefs = new (getMemoryManager()) RefHash2KeysTableOf<SchemaAttDef>(29, true);
             }
 
             retVal = fAttDefs->get(baseName, uriId);
@@ -272,7 +277,7 @@ XMLAttDef* SchemaElementDecl::findAttr(const XMLCh* const    qName
             if (!retVal)
             {
                 // And add a default attribute for this name
-                retVal = new SchemaAttDef(prefix, baseName, uriId);
+                retVal = new (getMemoryManager()) SchemaAttDef(prefix, baseName, uriId);
                 retVal->setElemId(getId());
                 fAttDefs->put((void*)retVal->getAttName()->getLocalPart(), uriId, retVal);
 
diff --git a/src/xercesc/validators/schema/SchemaElementDecl.hpp b/src/xercesc/validators/schema/SchemaElementDecl.hpp
index d48272d5b..2d7eb5740 100644
--- a/src/xercesc/validators/schema/SchemaElementDecl.hpp
+++ b/src/xercesc/validators/schema/SchemaElementDecl.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.9  2003/05/15 18:57:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.8  2003/01/29 19:47:16  gareth
  * added DOMTypeInfo and some PSVI methods
  *
@@ -179,22 +182,23 @@ public :
     // -----------------------------------------------------------------------
     //  Constructors and Destructor
     // -----------------------------------------------------------------------
-    SchemaElementDecl();
-
+    SchemaElementDecl(MemoryManager* const manager);
     SchemaElementDecl
     (
-        const XMLCh* const       prefix
-      , const XMLCh* const       localPart
-      , const int                uriId
-      , const ModelTypes         modelType = Any
-      , const int                enclosingScope = Grammar::TOP_LEVEL_SCOPE
+          const XMLCh* const   prefix
+        , const XMLCh* const   localPart
+        , const int            uriId
+        , const ModelTypes     modelType// = Any
+        , const int            enclosingScope// = Grammar::TOP_LEVEL_SCOPE
+        , MemoryManager* const manager
     );
 
     SchemaElementDecl
     (
-        const QName* const       elementName
-      , const ModelTypes         modelType = Any
-      , const int                enclosingScope = Grammar::TOP_LEVEL_SCOPE
+          const QName* const   elementName
+        , const ModelTypes     modelType// = Any
+        , const int            enclosingScope// = Grammar::TOP_LEVEL_SCOPE
+        , MemoryManager* const manager
     );
 
     ~SchemaElementDecl();
@@ -783,10 +787,10 @@ inline void SchemaElementDecl::setMiscFlags(const int flags)
 inline void SchemaElementDecl::setDefaultValue(const XMLCh* const value)
 {
     if (fDefaultValue) {
-        delete[] fDefaultValue;
+        getMemoryManager()->deallocate(fDefaultValue);//delete[] fDefaultValue;
     }
 
-    fDefaultValue = XMLString::replicate(value);
+    fDefaultValue = XMLString::replicate(value, getMemoryManager());
 }
 
 inline void
diff --git a/src/xercesc/validators/schema/SchemaGrammar.cpp b/src/xercesc/validators/schema/SchemaGrammar.cpp
index 5df70a996..b19d97f67 100644
--- a/src/xercesc/validators/schema/SchemaGrammar.cpp
+++ b/src/xercesc/validators/schema/SchemaGrammar.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.4  2003/05/15 18:57:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/11/04 14:49:41  tng
  * C++ Namespace Support.
  *
@@ -117,7 +120,7 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  SchemaGrammar: Constructors and Destructor
 // ---------------------------------------------------------------------------
-SchemaGrammar::SchemaGrammar() :
+SchemaGrammar::SchemaGrammar(MemoryManager* const manager) :
     fTargetNamespace(0)
     , fElemDeclPool(0)
     , fElemNonDeclPool(0)
@@ -130,7 +133,9 @@ SchemaGrammar::SchemaGrammar() :
     , fNamespaceScope(0)
     , fValidSubstitutionGroups(0)
     , fIDRefList(0)
+    , fMemoryManager(manager)
     , fValidated(false)
+    , fDatatypeRegistry(manager)
 {
     //
     //  Init all the pool members.
@@ -138,13 +143,13 @@ SchemaGrammar::SchemaGrammar() :
     //  <TBD> Investigate what the optimum values would be for the various
     //  pools.
     //
-    fElemDeclPool = new RefHash3KeysIdPool<SchemaElementDecl>(109);
+    fElemDeclPool = new (fMemoryManager) RefHash3KeysIdPool<SchemaElementDecl>(109);
 
     try {
-        fElemNonDeclPool = new RefHash3KeysIdPool<SchemaElementDecl>(29);
-        fGroupElemDeclPool = new RefHash3KeysIdPool<SchemaElementDecl>(109, false);
+        fElemNonDeclPool = new (fMemoryManager) RefHash3KeysIdPool<SchemaElementDecl>(29);
+        fGroupElemDeclPool = new (fMemoryManager) RefHash3KeysIdPool<SchemaElementDecl>(109, false);
         fNotationDeclPool = new NameIdPool<XMLNotationDecl>(109);
-        fIDRefList = new RefHashTableOf<XMLRefInfo>(29);
+        fIDRefList = new (fMemoryManager) RefHashTableOf<XMLRefInfo>(29);
         fDatatypeRegistry.expandRegistryToFullSchemaSet();
 
         //
@@ -183,7 +188,15 @@ XMLElementDecl* SchemaGrammar::findOrAddElemDecl (const   unsigned int    uriId
     // if not, then add this in
     if (!retVal)
     {
-        retVal = new SchemaElementDecl(prefixName, baseName, uriId, SchemaElementDecl::Any);
+        retVal = new (fMemoryManager) SchemaElementDecl
+        (
+            prefixName
+            , baseName
+            , uriId
+            , SchemaElementDecl::Any
+            , Grammar::TOP_LEVEL_SCOPE
+            , fMemoryManager
+        );
         const unsigned int elemId = fElemNonDeclPool->put((void*)retVal->getBaseName(), uriId, scope, retVal);
         retVal->setId(elemId);
         wasAdded = true;
@@ -202,7 +215,15 @@ XMLElementDecl* SchemaGrammar::putElemDecl (const   unsigned int    uriId
         , unsigned int          scope
         , const bool            notDeclared)
 {
-    SchemaElementDecl* retVal = new SchemaElementDecl(prefixName, baseName, uriId, SchemaElementDecl::Any);
+    SchemaElementDecl* retVal = new (fMemoryManager) SchemaElementDecl
+    (
+        prefixName
+        , baseName
+        , uriId
+        , SchemaElementDecl::Any
+        , Grammar::TOP_LEVEL_SCOPE
+        , fMemoryManager
+    );
     const unsigned int elemId = (notDeclared) ? fElemNonDeclPool->put((void*)retVal->getBaseName(), uriId, scope, retVal)
                                               : fElemDeclPool->put((void*)retVal->getBaseName(), uriId, scope, retVal);
     retVal->setId(elemId);
@@ -228,7 +249,7 @@ void SchemaGrammar::cleanUp()
     delete fElemNonDeclPool;
     delete fGroupElemDeclPool;
     delete fNotationDeclPool;
-    delete [] fTargetNamespace;
+    fMemoryManager->deallocate(fTargetNamespace);//delete [] fTargetNamespace;
     delete fAttributeDeclRegistry;
     delete fComplexTypeRegistry;
     delete fGroupInfoRegistry;
diff --git a/src/xercesc/validators/schema/SchemaGrammar.hpp b/src/xercesc/validators/schema/SchemaGrammar.hpp
index 4567cdc72..376e4ee43 100644
--- a/src/xercesc/validators/schema/SchemaGrammar.hpp
+++ b/src/xercesc/validators/schema/SchemaGrammar.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.6  2003/05/15 18:57:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.5  2002/11/04 14:49:41  tng
  * C++ Namespace Support.
  *
@@ -159,7 +162,7 @@ public:
     // -----------------------------------------------------------------------
     //  Constructors and Destructor
     // -----------------------------------------------------------------------
-    SchemaGrammar();
+    SchemaGrammar(MemoryManager* const manager);
     virtual ~SchemaGrammar();
 
     // -----------------------------------------------------------------------
@@ -351,11 +354,12 @@ private:
     RefHashTableOf<ComplexTypeInfo>*       fComplexTypeRegistry;
     RefHashTableOf<XercesGroupInfo>*       fGroupInfoRegistry;
     RefHashTableOf<XercesAttGroupInfo>*    fAttGroupInfoRegistry;
-    DatatypeValidatorFactory               fDatatypeRegistry;
     NamespaceScope*                        fNamespaceScope;
     RefHash2KeysTableOf<ElemVector>*       fValidSubstitutionGroups;
     RefHashTableOf<XMLRefInfo>*            fIDRefList;
+    MemoryManager*                         fMemoryManager;
     bool                                   fValidated;
+    DatatypeValidatorFactory               fDatatypeRegistry;
 };
 
 
@@ -415,9 +419,11 @@ inline RefHashTableOf<XMLRefInfo>* SchemaGrammar::getIDRefList() const {
 // -----------------------------------------------------------------------
 //  Setter methods
 // -----------------------------------------------------------------------
-inline void SchemaGrammar::setTargetNamespace(const XMLCh* const targetNamespace) {
-    delete [] fTargetNamespace;
-    fTargetNamespace = XMLString::replicate(targetNamespace);
+inline void SchemaGrammar::setTargetNamespace(const XMLCh* const targetNamespace)
+{
+    if (fTargetNamespace)
+        fMemoryManager->deallocate(fTargetNamespace);//delete [] fTargetNamespace;
+    fTargetNamespace = XMLString::replicate(targetNamespace, fMemoryManager);
 }
 
 inline void
diff --git a/src/xercesc/validators/schema/SchemaInfo.hpp b/src/xercesc/validators/schema/SchemaInfo.hpp
index 04b1335eb..3888ac573 100644
--- a/src/xercesc/validators/schema/SchemaInfo.hpp
+++ b/src/xercesc/validators/schema/SchemaInfo.hpp
@@ -83,7 +83,7 @@
 
 XERCES_CPP_NAMESPACE_BEGIN
 
-class VALIDATORS_EXPORT SchemaInfo
+class VALIDATORS_EXPORT SchemaInfo : public XMemory
 {
 public:
 
diff --git a/src/xercesc/validators/schema/SchemaValidator.cpp b/src/xercesc/validators/schema/SchemaValidator.cpp
index 7883ceb43..ab547d9cd 100644
--- a/src/xercesc/validators/schema/SchemaValidator.cpp
+++ b/src/xercesc/validators/schema/SchemaValidator.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.29  2003/05/15 18:57:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.28  2003/02/06 13:51:55  gareth
  * fixed bug with multiple attributes being validated by the same union type.
  *
@@ -251,9 +254,11 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  SchemaValidator: Constructors and Destructor
 // ---------------------------------------------------------------------------
-SchemaValidator::SchemaValidator(XMLErrorReporter* const errReporter) :
+SchemaValidator::SchemaValidator( XMLErrorReporter* const errReporter
+                                , MemoryManager* const    manager) :
 
     XMLValidator(errReporter)
+    , fMemoryManager(manager)
     , fGrammarResolver(0)
     , fSchemaGrammar(0)
     , fTrailing(false)
diff --git a/src/xercesc/validators/schema/SchemaValidator.hpp b/src/xercesc/validators/schema/SchemaValidator.hpp
index 157af4ded..47af4c384 100644
--- a/src/xercesc/validators/schema/SchemaValidator.hpp
+++ b/src/xercesc/validators/schema/SchemaValidator.hpp
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 2001 The Apache Software Foundation.  All rights
+ * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.14  2003/05/15 18:57:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.13  2003/01/20 19:04:48  knoaman
  * Fix for particle derivation checking.
  *
@@ -135,19 +138,19 @@
 #if !defined(SCHEMAVALIDATOR_HPP)
 #define SCHEMAVALIDATOR_HPP
 
-#include <xercesc/framework/XMLBuffer.hpp>
 #include <xercesc/framework/XMLValidator.hpp>
-#include <xercesc/util/RefVectorOf.hpp>
+#include <xercesc/framework/XMLBuffer.hpp>
 #include <xercesc/util/ValueStackOf.hpp>
-#include <xercesc/validators/common/GrammarResolver.hpp>
 #include <xercesc/validators/common/ContentSpecNode.hpp>
-#include <xercesc/validators/datatype/DatatypeValidator.hpp>
-#include <xercesc/validators/schema/SchemaElementDecl.hpp>
 #include <xercesc/validators/schema/SchemaGrammar.hpp>
 #include <xercesc/validators/schema/XSDErrorReporter.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
+class GrammarResolver;
+class DatatypeValidator;
+class SchemaElementDecl;
+
 //
 //  This is a derivative of the abstract validator interface. This class
 //  implements a validator that supports standard XML Schema semantics.
@@ -160,7 +163,11 @@ public:
     // -----------------------------------------------------------------------
     //  Constructors and Destructor
     // -----------------------------------------------------------------------
-    SchemaValidator(XMLErrorReporter* const errReporter = 0);
+    SchemaValidator
+    (
+          XMLErrorReporter* const errReporter// = 0
+        , MemoryManager* const    manager
+    );
     virtual ~SchemaValidator();
 
     // -----------------------------------------------------------------------
@@ -368,17 +375,16 @@ private:
     //  fTypeStack
     //      Stack of complex type declarations.
     // -----------------------------------------------------------------------
-    SchemaGrammar* fSchemaGrammar;
-    GrammarResolver* fGrammarResolver;
-    QName* fXsiType;
-    bool fNil;
-
-    DatatypeValidator* fXsiTypeValidator;
-
-    XMLBuffer fDatatypeBuffer;
-    bool fTrailing;
-    bool fSeenId;
-    XSDErrorReporter fSchemaErrorReporter;
+    MemoryManager*                  fMemoryManager;
+    SchemaGrammar*                  fSchemaGrammar;
+    GrammarResolver*                fGrammarResolver;
+    QName*                          fXsiType;
+    bool                            fNil;
+    DatatypeValidator*              fXsiTypeValidator;
+    XMLBuffer                       fDatatypeBuffer;
+    bool                            fTrailing;
+    bool                            fSeenId;
+    XSDErrorReporter                fSchemaErrorReporter;
     ValueStackOf<ComplexTypeInfo*>* fTypeStack;
 };
 
diff --git a/src/xercesc/validators/schema/TraverseSchema.cpp b/src/xercesc/validators/schema/TraverseSchema.cpp
index 55462867c..ac3c0eea4 100644
--- a/src/xercesc/validators/schema/TraverseSchema.cpp
+++ b/src/xercesc/validators/schema/TraverseSchema.cpp
@@ -195,7 +195,8 @@ TraverseSchema::TraverseSchema( DOMElement* const    schemaRoot
                               , XMLScanner* const      xmlScanner
                               , const XMLCh* const     schemaURL
                               , XMLEntityHandler* const  entityHandler
-                              , XMLErrorReporter* const errorReporter)
+                              , XMLErrorReporter* const errorReporter
+                              , MemoryManager* const    manager)
     : fFullConstraintChecking(false)
     , fTargetNSURI(-1)
     , fEmptyNamespaceURI(-1)
@@ -238,6 +239,8 @@ TraverseSchema::TraverseSchema( DOMElement* const    schemaRoot
     , fParser(0)
     , fPreprocessedNodes(0)
     , fLocator(0)
+    , fMemoryManager(manager)
+    , fAttributeCheck(manager)
 {
 
     try {
@@ -318,7 +321,7 @@ void TraverseSchema::preprocessSchema(DOMElement* const schemaRoot,
 
     if (fComplexTypeRegistry == 0 ) {
 
-        fComplexTypeRegistry = new RefHashTableOf<ComplexTypeInfo>(29);
+        fComplexTypeRegistry = new (fMemoryManager) RefHashTableOf<ComplexTypeInfo>(29);
         fSchemaGrammar->setComplexTypeRegistry(fComplexTypeRegistry);
     }
 
@@ -326,7 +329,7 @@ void TraverseSchema::preprocessSchema(DOMElement* const schemaRoot,
 
     if (fGroupRegistry == 0 ) {
 
-        fGroupRegistry = new RefHashTableOf<XercesGroupInfo>(13);
+        fGroupRegistry = new (fMemoryManager) RefHashTableOf<XercesGroupInfo>(13);
         fSchemaGrammar->setGroupInfoRegistry(fGroupRegistry);
     }
 
@@ -334,7 +337,7 @@ void TraverseSchema::preprocessSchema(DOMElement* const schemaRoot,
 
     if (fAttGroupRegistry == 0 ) {
 
-        fAttGroupRegistry = new RefHashTableOf<XercesAttGroupInfo>(13);
+        fAttGroupRegistry = new (fMemoryManager) RefHashTableOf<XercesAttGroupInfo>(13);
         fSchemaGrammar->setAttGroupInfoRegistry(fAttGroupRegistry);
     }
 
@@ -342,7 +345,7 @@ void TraverseSchema::preprocessSchema(DOMElement* const schemaRoot,
 
     if (fAttributeDeclRegistry == 0) {
 
-        fAttributeDeclRegistry = new RefHashTableOf<XMLAttDef>(29);
+        fAttributeDeclRegistry = new (fMemoryManager) RefHashTableOf<XMLAttDef>(29);
         fSchemaGrammar->setAttributeDeclRegistry(fAttributeDeclRegistry);
     }
 
@@ -350,7 +353,7 @@ void TraverseSchema::preprocessSchema(DOMElement* const schemaRoot,
 
     if (fNamespaceScope == 0) {
 
-        fNamespaceScope = new NamespaceScope();
+        fNamespaceScope = new (fMemoryManager) NamespaceScope();
         fNamespaceScope->reset(fEmptyNamespaceURI);
         fSchemaGrammar->setNamespaceScope(fNamespaceScope);
     }
@@ -359,7 +362,7 @@ void TraverseSchema::preprocessSchema(DOMElement* const schemaRoot,
 
     if (!fValidSubstitutionGroups) {
 
-        fValidSubstitutionGroups = new RefHash2KeysTableOf<ElemVector>(29);
+        fValidSubstitutionGroups = new (fMemoryManager) RefHash2KeysTableOf<ElemVector>(29);
         fSchemaGrammar->setValidSubstitutionGroups(fValidSubstitutionGroups);
     }
 
@@ -375,7 +378,7 @@ void TraverseSchema::preprocessSchema(DOMElement* const schemaRoot,
     fAttributeCheck.setIDRefList(fSchemaGrammar->getIDRefList());
 
     // Save current schema info
-    SchemaInfo* currInfo = new SchemaInfo(0, 0, 0, fTargetNSURI, fScopeCount,
+    SchemaInfo* currInfo = new (fMemoryManager) SchemaInfo(0, 0, 0, fTargetNSURI, fScopeCount,
                                           fNamespaceScope->increaseDepth(),
                                           XMLString::replicate(schemaURL),
                                           fTargetNSURIString, schemaRoot);
@@ -513,7 +516,7 @@ void TraverseSchema::preprocessInclude(const DOMElement* const elem) {
     // Parse input source
     // ------------------------------------------------------------------
     if (!fParser)
-        fParser = new XSDDOMParser;
+        fParser = new (fMemoryManager) XSDDOMParser;
 
     fParser->setValidationScheme(XercesDOMParser::Val_Never);
     fParser->setDoNamespaces(true);
@@ -565,7 +568,7 @@ void TraverseSchema::preprocessInclude(const DOMElement* const elem) {
             // --------------------------------------------------------
             SchemaInfo* saveInfo = fSchemaInfo;
 
-            fSchemaInfo = new SchemaInfo(0, 0, 0, fTargetNSURI, fScopeCount,
+            fSchemaInfo = new (fMemoryManager) SchemaInfo(0, 0, 0, fTargetNSURI, fScopeCount,
                                          fNamespaceScope->increaseDepth(),
                                          XMLString::replicate(includeURL),
                                          fTargetNSURIString, root);
@@ -691,7 +694,7 @@ void TraverseSchema::preprocessImport(const DOMElement* const elem) {
     // Parse input source
     // ------------------------------------------------------------------
     if (!fParser)
-        fParser = new XSDDOMParser;
+        fParser = new (fMemoryManager) XSDDOMParser;
 
     fParser->setValidationScheme(XercesDOMParser::Val_Never);
     fParser->setDoNamespaces(true);
@@ -735,7 +738,7 @@ void TraverseSchema::preprocessImport(const DOMElement* const elem) {
             // Preprocess new schema
             // --------------------------------------------------------
             SchemaInfo* saveInfo = fSchemaInfo;
-            fSchemaGrammar = new SchemaGrammar();
+            fSchemaGrammar = new (fMemoryManager) SchemaGrammar(fMemoryManager);
             preprocessSchema(root, importURL);
             fPreprocessedNodes->put((void*) elem, fSchemaInfo);
 
@@ -804,7 +807,7 @@ void TraverseSchema::preprocessRedefine(const DOMElement* const redefineElem) {
     }
 
     if (!fRedefineComponents) {
-        fRedefineComponents = new RefHash2KeysTableOf<XMLCh>(13, false);
+        fRedefineComponents = new (fMemoryManager) RefHash2KeysTableOf<XMLCh>(13, false);
     }
 
     SchemaInfo* redefinedInfo = fSchemaInfo;
@@ -882,7 +885,7 @@ TraverseSchema::traverseChoiceSequence(const DOMElement* const elem,
                 continue;
             }
 
-            contentSpecNode = new ContentSpecNode(eltQName, false);
+            contentSpecNode = new (fMemoryManager) ContentSpecNode(eltQName, false);
             seeParticle = true;
         }
         else if (XMLString::equals(childName, SchemaSymbols::fgELT_GROUP)) {
@@ -905,7 +908,7 @@ TraverseSchema::traverseChoiceSequence(const DOMElement* const elem,
                 continue;
             }
 
-            contentSpecNode = new ContentSpecNode(*contentSpecNode);
+            contentSpecNode = new (fMemoryManager) ContentSpecNode(*contentSpecNode);
             seeParticle = true;
         }
         else if (XMLString::equals(childName, SchemaSymbols::fgELT_CHOICE)) {
@@ -942,13 +945,13 @@ TraverseSchema::traverseChoiceSequence(const DOMElement* const elem,
             right = contentSpecNode;
         }
         else {
-            left = new ContentSpecNode((ContentSpecNode::NodeTypes) modelGroupType, left, right);
+            left = new (fMemoryManager) ContentSpecNode((ContentSpecNode::NodeTypes) modelGroupType, left, right);
             right = contentSpecNode;
         }
     }
 
     if (hadContent) {
-        left = new ContentSpecNode((ContentSpecNode::NodeTypes) modelGroupType, left, right);
+        left = new (fMemoryManager) ContentSpecNode((ContentSpecNode::NodeTypes) modelGroupType, left, right);
     }
 
     return left;
@@ -1163,7 +1166,7 @@ int TraverseSchema::traverseComplexTypeDecl(const DOMElement* const elem,
         // ------------------------------------------------------------------
         // Register the type
         // ------------------------------------------------------------------
-        typeInfo = new ComplexTypeInfo();
+        typeInfo = new (fMemoryManager) ComplexTypeInfo(fMemoryManager);
         if(isAnonymous) {
             typeInfo->setAnonymous();
         }
@@ -1366,7 +1369,7 @@ TraverseSchema::traverseGroupDecl(const DOMElement* const elem,
     ContentSpecNode* specNode = 0;
     XercesGroupInfo* saveGroupInfo = fCurrentGroupInfo;
 
-    groupInfo = new XercesGroupInfo();
+    groupInfo = new (fMemoryManager) XercesGroupInfo(fMemoryManager);
     fCurrentGroupStack->addElement(nameIndex);
     fCurrentGroupInfo = groupInfo;
 
@@ -1512,7 +1515,7 @@ TraverseSchema::traverseAttributeGroupDecl(const DOMElement* const elem,
     // Process contents of global attributeGroups
     // ------------------------------------------------------------------
     XercesAttGroupInfo* saveAttGroupInfo = fCurrentAttGroupInfo;
-    XercesAttGroupInfo* attGroupInfo = new XercesAttGroupInfo();
+    XercesAttGroupInfo* attGroupInfo = new (fMemoryManager) XercesAttGroupInfo(fMemoryManager);
 
     fDeclStack->addElement(elem);
     fCurrentAttGroupInfo = attGroupInfo;
@@ -1671,14 +1674,14 @@ TraverseSchema::traverseAny(const DOMElement* const elem) {
 
     if ((!nameSpace || !*nameSpace)
         || XMLString::equals(nameSpace, SchemaSymbols::fgATTVAL_TWOPOUNDANY)) {
-        retSpecNode = new ContentSpecNode(new QName(XMLUni::fgZeroLenString,
+        retSpecNode = new (fMemoryManager) ContentSpecNode(new (fMemoryManager) QName(XMLUni::fgZeroLenString,
                                                     XMLUni::fgZeroLenString,
                                                     fEmptyNamespaceURI),
                                           false);
         retSpecNode->setType(anyType);
     }
     else if (XMLString::equals(nameSpace, SchemaSymbols::fgATTVAL_TWOPOUNDOTHER)) {
-        retSpecNode = new ContentSpecNode(new QName(XMLUni::fgZeroLenString,
+        retSpecNode = new (fMemoryManager) ContentSpecNode(new (fMemoryManager) QName(XMLUni::fgZeroLenString,
                                                     XMLUni::fgZeroLenString,
                                                     fTargetNSURI),
                                           false);
@@ -1720,7 +1723,7 @@ TraverseSchema::traverseAny(const DOMElement* const elem) {
 
             uriList.addElement(uriIndex);
 
-            firstNode = new ContentSpecNode(new QName(XMLUni::fgZeroLenString,
+            firstNode = new (fMemoryManager) ContentSpecNode(new (fMemoryManager) QName(XMLUni::fgZeroLenString,
                                                       XMLUni::fgZeroLenString,
                                                       uriIndex),
                                             false);
@@ -1730,7 +1733,7 @@ TraverseSchema::traverseAny(const DOMElement* const elem) {
                 secondNode = firstNode;
             }
             else {
-                secondNode = new ContentSpecNode(ContentSpecNode::Choice, secondNode, firstNode);
+                secondNode = new (fMemoryManager) ContentSpecNode(ContentSpecNode::Choice, secondNode, firstNode);
             }
         }
 
@@ -1787,7 +1790,7 @@ TraverseSchema::traverseAll(const DOMElement* const elem) {
                 continue;
             }
 
-            contentSpecNode = new ContentSpecNode(eltQName, false);
+            contentSpecNode = new (fMemoryManager) ContentSpecNode(eltQName, false);
             checkMinMax(contentSpecNode, child, All_Element);
         }
         else {
@@ -1805,13 +1808,13 @@ TraverseSchema::traverseAll(const DOMElement* const elem) {
             right = contentSpecNode;
         }
         else {
-            left = new ContentSpecNode(ContentSpecNode::All, left, right);
+            left = new (fMemoryManager) ContentSpecNode(ContentSpecNode::All, left, right);
             right = contentSpecNode;
         }
     }
 
     if (hadContent) {
-        left = new ContentSpecNode(ContentSpecNode::All, left, right);
+        left = new (fMemoryManager) ContentSpecNode(ContentSpecNode::All, left, right);
     }
 
     return left;
@@ -2114,7 +2117,7 @@ void TraverseSchema::traverseAttributeDecl(const DOMElement* const elem,
     }
 
     // create SchemaAttDef
-    SchemaAttDef* attDef = new SchemaAttDef(XMLUni::fgZeroLenString, name, uriIndex, attType);
+    SchemaAttDef* attDef = new (fMemoryManager) SchemaAttDef(XMLUni::fgZeroLenString, name, uriIndex, attType);
 
     attDef->setDatatypeValidator(dv);
 
@@ -2209,7 +2212,7 @@ QName* TraverseSchema::traverseElementDecl(const DOMElement* const elem,
     if (topLevel) {
 
         if (fSchemaGrammar->getElemDecl(fTargetNSURI, name, 0, Grammar::TOP_LEVEL_SCOPE) != 0) {
-            return new QName(name, fTargetNSURI);
+            return new (fMemoryManager) QName(name, fTargetNSURI);
         }
     }
 
@@ -2450,20 +2453,20 @@ QName* TraverseSchema::traverseElementDecl(const DOMElement* const elem,
                                     subsElements = aGrammar->getValidSubstitutionGroups()->get(subsElemBaseName, subsElemURI);
 
                                     if (subsElements) {
-                                        subsElements = new ValueVectorOf<SchemaElementDecl*>(*subsElements);
+                                        subsElements = new (fMemoryManager) ValueVectorOf<SchemaElementDecl*>(*subsElements);
                                         fValidSubstitutionGroups->put(subsElemBaseName, subsElemURI, subsElements);
                                     }
                                     else if (fSchemaInfo->circularImportExist(subsElemURI)) {
 
                                         aGrammar->getValidSubstitutionGroups()->put(
-                                        subsElemBaseName, subsElemURI, new ValueVectorOf<SchemaElementDecl*>(8));
+                                        subsElemBaseName, subsElemURI, new (fMemoryManager) ValueVectorOf<SchemaElementDecl*>(8));
                                     }
                                 }
                             }
 
                             if (!subsElements) {
 
-                                subsElements = new ValueVectorOf<SchemaElementDecl*>(8);
+                                subsElements = new (fMemoryManager) ValueVectorOf<SchemaElementDecl*>(8);
                                 fValidSubstitutionGroups->put(subsElemBaseName, subsElemURI, subsElements);
                             }
 
@@ -2585,7 +2588,7 @@ QName* TraverseSchema::traverseElementDecl(const DOMElement* const elem,
         elemDecl->setContentSpec(contentSpecNode);
 
         if (isAnyType) {
-            elemDecl->setAttWildCard(new SchemaAttDef(XMLUni::fgZeroLenString,
+            elemDecl->setAttWildCard(new (fMemoryManager) SchemaAttDef(XMLUni::fgZeroLenString,
                                                       XMLUni::fgZeroLenString,
                                                       fEmptyNamespaceURI, XMLAttDef::Any_Any,
                                                       XMLAttDef::ProcessContents_Lax));
@@ -2607,7 +2610,7 @@ QName* TraverseSchema::traverseElementDecl(const DOMElement* const elem,
             else {
 
                 if (!icNodes) {
-                    icNodes = new ValueVectorOf<DOMElement*>(8);
+                    icNodes = new (fMemoryManager) ValueVectorOf<DOMElement*>(8);
                 }
 
                 icNodes->addElement(ic);
@@ -2621,9 +2624,9 @@ QName* TraverseSchema::traverseElementDecl(const DOMElement* const elem,
 
             if (!fIC_ElementsNS) {
 
-                fIC_ElementsNS = new RefHashTableOf<ElemVector>(13);
-                fIC_NamespaceDepthNS = new RefHashTableOf<ValueVectorOf<unsigned int> >(13);
-                fIC_NodeListNS = new RefHashTableOf<ValueVectorOf<DOMElement*> >(29, true, new HashPtr());
+                fIC_ElementsNS = new (fMemoryManager) RefHashTableOf<ElemVector>(13);
+                fIC_NamespaceDepthNS = new (fMemoryManager) RefHashTableOf<ValueVectorOf<unsigned int> >(13);
+                fIC_NodeListNS = new (fMemoryManager) RefHashTableOf<ValueVectorOf<DOMElement*> >(29, true, new (fMemoryManager) HashPtr());
             }
 
             if (fIC_ElementsNS->containsKey(fTargetNSURIString)) {
@@ -2634,8 +2637,8 @@ QName* TraverseSchema::traverseElementDecl(const DOMElement* const elem,
 
             if (!fIC_Elements) {
 
-                fIC_Elements = new ValueVectorOf<SchemaElementDecl*>(8);
-                fIC_NamespaceDepth = new ValueVectorOf<unsigned int>(8);
+                fIC_Elements = new (fMemoryManager) ValueVectorOf<SchemaElementDecl*>(8);
+                fIC_NamespaceDepth = new (fMemoryManager) ValueVectorOf<unsigned int>(8);
                 fIC_ElementsNS->put((void*) fTargetNSURIString, fIC_Elements);
                 fIC_NamespaceDepthNS->put((void*) fTargetNSURIString, fIC_NamespaceDepth);
             }
@@ -2646,7 +2649,7 @@ QName* TraverseSchema::traverseElementDecl(const DOMElement* const elem,
         }
     }
 
-    return new QName(*elemDecl->getElementName());
+    return new (fMemoryManager) QName(*elemDecl->getElementName());
 }
 
 const XMLCh* TraverseSchema::traverseNotationDecl(const DOMElement* const elem) {
@@ -2904,7 +2907,7 @@ TraverseSchema::traverseByRestriction(const DOMElement* const rootElem,
                 fAttributeCheck.checkAttributes(content, scope, this);
 
                 if (facets == 0) {
-                    facets = new RefHashTableOf<KVStringPair>(29, true);
+                    facets = new (fMemoryManager) RefHashTableOf<KVStringPair>(29, true);
                 }
 
                 if (XMLString::equals(facetName, SchemaSymbols::fgELT_ENUMERATION)) {
@@ -2914,7 +2917,7 @@ TraverseSchema::traverseByRestriction(const DOMElement* const rootElem,
                     // to get the qualified name first before adding it to the
                     // enum buffer
                     if (!enums) {
-                        enums = new RefArrayVectorOf<XMLCh>(8, true);
+                        enums = new (fMemoryManager) RefArrayVectorOf<XMLCh>(8, true);
                     }
 
                     if (baseValidator->getType() == DatatypeValidator::NOTATION) {
@@ -2965,7 +2968,7 @@ TraverseSchema::traverseByRestriction(const DOMElement* const rootElem,
                         else {
 
                             const XMLCh* facetStr = fStringPool->getValueForId(fStringPool->addOrFind(facetName));
-                            facets->put((void*) facetStr, new KVStringPair(facetStr, attValue));
+                            facets->put((void*) facetStr, new (fMemoryManager) KVStringPair(facetStr, attValue));
                             checkFixedFacet(content, facetStr, baseValidator, fixedFlag);
                         }
                     }
@@ -2982,14 +2985,14 @@ TraverseSchema::traverseByRestriction(const DOMElement* const rootElem,
 
         if (!pattern.isEmpty()) {
             facets->put((void*) SchemaSymbols::fgELT_PATTERN,
-                        new KVStringPair(SchemaSymbols::fgELT_PATTERN, pattern.getRawBuffer()));
+                        new (fMemoryManager) KVStringPair(SchemaSymbols::fgELT_PATTERN, pattern.getRawBuffer()));
         }
 
         if (fixedFlag) {
 
             XMLString::binToText(fixedFlag, fixedFlagStr, 15, 10);
             facets->put((void*) SchemaSymbols::fgATT_FIXED,
-                        new KVStringPair(SchemaSymbols::fgATT_FIXED, fixedFlagStr));
+                        new (fMemoryManager) KVStringPair(SchemaSymbols::fgATT_FIXED, fixedFlagStr));
         }
 
         try {
@@ -3026,7 +3029,7 @@ TraverseSchema::traverseByUnion(const DOMElement* const rootElem,
     int                             size = 1;
     const XMLCh*                    baseTypeName = getElementAttValue(contentElem, SchemaSymbols::fgATT_MEMBERTYPES);
     DatatypeValidator*              baseValidator = 0;
-    RefVectorOf<DatatypeValidator>* validators = new RefVectorOf<DatatypeValidator>(4, false);
+    RefVectorOf<DatatypeValidator>* validators = new (fMemoryManager) RefVectorOf<DatatypeValidator>(4, false);
     Janitor<DVRefVector>            janValidators(validators);
     DOMElement*                     content = 0;
 
@@ -3343,13 +3346,13 @@ void TraverseSchema::traverseSimpleContentDecl(const XMLCh* const typeName,
                     const XMLCh* attValue = content->getAttribute(SchemaSymbols::fgATT_VALUE);
 
                     if (facets == 0) {
-                        facets = new RefHashTableOf<KVStringPair>(29, true);
+                        facets = new (fMemoryManager) RefHashTableOf<KVStringPair>(29, true);
                     }
 
                     if (XMLString::equals(facetName, SchemaSymbols::fgELT_ENUMERATION)) {
 
                         if (!enums) {
-                            enums = new RefArrayVectorOf<XMLCh>(8, true);
+                            enums = new (fMemoryManager) RefArrayVectorOf<XMLCh>(8, true);
                         }
 
                         enums->addElement(XMLString::replicate(attValue));
@@ -3377,7 +3380,7 @@ void TraverseSchema::traverseSimpleContentDecl(const XMLCh* const typeName,
                             const XMLCh* facetNameStr =
                                 fStringPool->getValueForId(fStringPool->addOrFind(facetName));
 
-                            facets->put((void*) facetNameStr, new KVStringPair(facetNameStr, attValue));
+                            facets->put((void*) facetNameStr, new (fMemoryManager) KVStringPair(facetNameStr, attValue));
                             checkFixedFacet(content, facetNameStr, typeInfo->getBaseDatatypeValidator(), fixedFlag);
                         }
                     }
@@ -3392,7 +3395,7 @@ void TraverseSchema::traverseSimpleContentDecl(const XMLCh* const typeName,
                     facets->put
                     (
                         (void*) SchemaSymbols::fgELT_PATTERN,
-                        new KVStringPair
+                        new (fMemoryManager) KVStringPair
                             (
                                 SchemaSymbols::fgELT_PATTERN,
                                 pattern.getRawBuffer()
@@ -3404,7 +3407,7 @@ void TraverseSchema::traverseSimpleContentDecl(const XMLCh* const typeName,
 
                     XMLString::binToText(fixedFlag, fixedFlagStr, 15, 10);
                     facets->put((void*) SchemaSymbols::fgATT_FIXED,
-                        new KVStringPair(SchemaSymbols::fgATT_FIXED, fixedFlagStr));
+                        new (fMemoryManager) KVStringPair(SchemaSymbols::fgATT_FIXED, fixedFlagStr));
                 }
 
                 try {
@@ -3707,7 +3710,7 @@ SchemaAttDef* TraverseSchema::traverseAnyAttribute(const DOMElement* const elem)
     // ------------------------------------------------------------------
     // Create wildcard attribute
     // ------------------------------------------------------------------
-    SchemaAttDef* attDef = new SchemaAttDef(XMLUni::fgZeroLenString,
+    SchemaAttDef* attDef = new (fMemoryManager) SchemaAttDef(XMLUni::fgZeroLenString,
                                             XMLUni::fgZeroLenString,
                                             uriIndex, attType, attDefType);
 
@@ -3751,7 +3754,7 @@ void TraverseSchema::traverseKey(const DOMElement* const icElem,
 
 
     if (!fIdentityConstraintNames) {
-        fIdentityConstraintNames = new RefHash2KeysTableOf<IdentityConstraint>(29, false);
+        fIdentityConstraintNames = new (fMemoryManager) RefHash2KeysTableOf<IdentityConstraint>(29, false);
     }
 
     if (fIdentityConstraintNames->containsKey(name, fTargetNSURI)) {
@@ -3760,7 +3763,7 @@ void TraverseSchema::traverseKey(const DOMElement* const icElem,
         return;
     }
 
-    IC_Key* icKey = new IC_Key(name, elemDecl->getBaseName());
+    IC_Key* icKey = new (fMemoryManager) IC_Key(name, elemDecl->getBaseName(), fMemoryManager);
     Janitor<IC_Key> janKey(icKey);
 
     fIdentityConstraintNames->put((void*) name, fTargetNSURI, icKey);
@@ -3812,7 +3815,7 @@ void TraverseSchema::traverseUnique(const DOMElement* const icElem,
     }
 
     if (!fIdentityConstraintNames) {
-        fIdentityConstraintNames = new RefHash2KeysTableOf<IdentityConstraint>(29, false);
+        fIdentityConstraintNames = new (fMemoryManager) RefHash2KeysTableOf<IdentityConstraint>(29, false);
     }
 
     if (fIdentityConstraintNames->containsKey(name, fTargetNSURI)) {
@@ -3821,7 +3824,7 @@ void TraverseSchema::traverseUnique(const DOMElement* const icElem,
         return;
     }
 
-    IC_Unique* icUnique = new IC_Unique(name, elemDecl->getBaseName());
+    IC_Unique* icUnique = new (fMemoryManager) IC_Unique(name, elemDecl->getBaseName(), fMemoryManager);
     Janitor<IC_Unique> janUnique(icUnique);
 
     fIdentityConstraintNames->put((void*) name, fTargetNSURI, icUnique);
@@ -3895,7 +3898,7 @@ void TraverseSchema::traverseKeyRef(const DOMElement* const icElem,
         return;
     }
 
-    IC_KeyRef* icKeyRef = new IC_KeyRef(name, elemDecl->getBaseName(), icKey);
+    IC_KeyRef* icKeyRef = new (fMemoryManager) IC_KeyRef(name, elemDecl->getBaseName(), icKey, fMemoryManager);
     Janitor<IC_KeyRef> janKeyRef(icKeyRef);
 
     fIdentityConstraintNames->put((void*) name, fTargetNSURI, icKeyRef);
@@ -3992,8 +3995,8 @@ bool TraverseSchema::traverseIdentityConstraint(IdentityConstraint* const ic,
     // ------------------------------------------------------------------
     try {
 
-        XercesXPath* sXPath = new XercesXPath(fBuffer.getRawBuffer(), fStringPool, fNamespaceScope, fEmptyNamespaceURI, true);
-        IC_Selector* icSelector = new IC_Selector(sXPath, ic);
+        XercesXPath* sXPath = new (fMemoryManager) XercesXPath(fBuffer.getRawBuffer(), fStringPool, fNamespaceScope, fEmptyNamespaceURI, true);
+        IC_Selector* icSelector = new (fMemoryManager) IC_Selector(sXPath, ic);
         ic->setSelector(icSelector);
     }
     catch (const XPathException& e) {
@@ -4044,8 +4047,8 @@ bool TraverseSchema::traverseIdentityConstraint(IdentityConstraint* const ic,
 
             try {
 
-                XercesXPath* fieldXPath = new XercesXPath(fBuffer.getRawBuffer(), fStringPool, fNamespaceScope, fEmptyNamespaceURI);
-                IC_Field* icField = new IC_Field(fieldXPath, ic);
+                XercesXPath* fieldXPath = new (fMemoryManager) XercesXPath(fBuffer.getRawBuffer(), fStringPool, fNamespaceScope, fEmptyNamespaceURI);
+                IC_Field* icField = new (fMemoryManager) IC_Field(fieldXPath, ic);
                 ic->addField(icField);
             }
             catch (const XPathException& e) {
@@ -4497,7 +4500,7 @@ QName* TraverseSchema::processElementDeclRef(const DOMElement* const elem,
     const XMLCh* prefix = getPrefix(refName);
     const XMLCh* localPart = getLocalPart(refName);
     const XMLCh* uriStr = resolvePrefixToURI(elem, prefix);
-    QName*       eltName = new QName(prefix , localPart, uriStr != 0
+    QName*       eltName = new (fMemoryManager) QName(prefix , localPart, uriStr != 0
                                        ? fURIStringPool->addOrFind(uriStr)
                                        : fEmptyNamespaceURI);
 
@@ -5197,10 +5200,15 @@ TraverseSchema::createSchemaElementDecl(const DOMElement* const elem,
     }
 
     const XMLCh* prefix = getPrefix(name);
-    SchemaElementDecl* elemDecl =
-        new SchemaElementDecl(prefix, name, uriIndex,
-                              (SchemaElementDecl::ModelTypes) elemType,
-                              enclosingScope);
+    SchemaElementDecl* elemDecl = new (fMemoryManager) SchemaElementDecl
+    (
+        prefix
+        , name
+        , uriIndex
+        , (SchemaElementDecl::ModelTypes) elemType
+        , enclosingScope
+        , fMemoryManager
+    );
 
     elemDecl->setFinalSet(finalSet);
     elemDecl->setBlockSet(blockSet);
@@ -5352,7 +5360,7 @@ void TraverseSchema::processAttributeDeclRef(const DOMElement* const elem,
     bool required = XMLString::equals(useAttr,SchemaSymbols::fgATTVAL_REQUIRED);
     bool prohibited = XMLString::equals(useAttr,SchemaSymbols::fgATTVAL_PROHIBITED);
     QName* attQName = refAttDef->getAttName();
-    SchemaAttDef* attDef = new SchemaAttDef(attQName->getPrefix(),
+    SchemaAttDef* attDef = new (fMemoryManager) SchemaAttDef(attQName->getPrefix(),
                                             attQName->getLocalPart(),
                                             attQName->getURI(),
                                             refAttValue,
@@ -5598,7 +5606,7 @@ void TraverseSchema::processComplexContent(const DOMElement* const ctElem,
 
                     int contentContext = specNode->hasAllContent() ? Group_Ref_With_All : Not_All_Context;
 
-                    specNode = new ContentSpecNode(*specNode);
+                    specNode = new (fMemoryManager) ContentSpecNode(*specNode);
                     checkMinMax(specNode, childElem, contentContext);
                 }
             }
@@ -5665,7 +5673,7 @@ void TraverseSchema::processComplexContent(const DOMElement* const ctElem,
             if (!specNode) {
 
                 if (baseSpecNode) {
-                    specNode = new ContentSpecNode(*baseSpecNode);
+                    specNode = new (fMemoryManager) ContentSpecNode(*baseSpecNode);
                     typeInfo->setContentSpec(specNode);
                     typeInfo->setAdoptContentSpec(true);
                 }
@@ -5688,8 +5696,8 @@ void TraverseSchema::processComplexContent(const DOMElement* const ctElem,
 
                 typeInfo->setAdoptContentSpec(false);
                 typeInfo->setContentSpec(
-                    new ContentSpecNode(ContentSpecNode::Sequence,
-                                        new ContentSpecNode(*baseSpecNode),
+                    new (fMemoryManager) ContentSpecNode(ContentSpecNode::Sequence,
+                                        new (fMemoryManager) ContentSpecNode(*baseSpecNode),
                                         specNode));
                 typeInfo->setAdoptContentSpec(true);
             }
@@ -5704,7 +5712,7 @@ void TraverseSchema::processComplexContent(const DOMElement* const ctElem,
     // -------------------------------------------------------------
     if (isBaseAnyType && typeDerivedBy == SchemaSymbols::XSD_EXTENSION) {
 
-        ContentSpecNode* anySpecNode = new ContentSpecNode(new QName(XMLUni::fgZeroLenString,
+        ContentSpecNode* anySpecNode = new (fMemoryManager) ContentSpecNode(new (fMemoryManager) QName(XMLUni::fgZeroLenString,
                                                                      XMLUni::fgZeroLenString,
                                                                      fEmptyNamespaceURI),
                                                            false);
@@ -5720,7 +5728,7 @@ void TraverseSchema::processComplexContent(const DOMElement* const ctElem,
         else {
 
             typeInfo->setAdoptContentSpec(false);
-            typeInfo->setContentSpec(new ContentSpecNode(ContentSpecNode::Sequence, anySpecNode, specNode));
+            typeInfo->setContentSpec(new (fMemoryManager) ContentSpecNode(ContentSpecNode::Sequence, anySpecNode, specNode));
             typeInfo->setAdoptContentSpec(true);
 
             if (!isMixed) {
@@ -5740,7 +5748,7 @@ void TraverseSchema::processComplexContent(const DOMElement* const ctElem,
         else {
             // add #PCDATA leaf and set its minOccurs to 0
             ContentSpecNode* pcdataNode =
-                  new ContentSpecNode(new QName(XMLUni::fgZeroLenString,
+                  new (fMemoryManager) ContentSpecNode(new (fMemoryManager) QName(XMLUni::fgZeroLenString,
                                                 XMLUni::fgZeroLenString,
                                                 XMLElementDecl::fgPCDataElemId),
                                       false);
@@ -6019,7 +6027,7 @@ void TraverseSchema::processAttributes(const DOMElement* const elem,
 
                 if (!attGroupWildCard) {
 
-                    attGroupWildCard = new SchemaAttDef(attGroupInfo->anyAttributeAt(0));
+                    attGroupWildCard = new (fMemoryManager) SchemaAttDef(attGroupInfo->anyAttributeAt(0));
 
                     for (unsigned int i= 1; i < anyAttCount; i++) {
                         attWildCardIntersection(attGroupWildCard, attGroupInfo->anyAttributeAt(i));
@@ -6032,7 +6040,7 @@ void TraverseSchema::processAttributes(const DOMElement* const elem,
                     attWildCardIntersection(completeWildCard, attGroupWildCard);
                 }
                 else {
-                    completeWildCard = new SchemaAttDef(attGroupWildCard);
+                    completeWildCard = new (fMemoryManager) SchemaAttDef(attGroupWildCard);
                     janCompleteWildCard.reset(completeWildCard);
                 }
             }
@@ -6062,7 +6070,7 @@ void TraverseSchema::processAttributes(const DOMElement* const elem,
 
         if (isBaseAnyType) {
 
-            baseAttWildCard = new SchemaAttDef(XMLUni::fgZeroLenString,
+            baseAttWildCard = new (fMemoryManager) SchemaAttDef(XMLUni::fgZeroLenString,
                                                XMLUni::fgZeroLenString,
                                                fEmptyNamespaceURI, XMLAttDef::Any_Any,
                                                XMLAttDef::ProcessContents_Lax);
@@ -6098,7 +6106,7 @@ void TraverseSchema::processAttributes(const DOMElement* const elem,
         }
         else {
 
-            SchemaAttDef* newWildCard = new SchemaAttDef(baseAttWildCard);
+            SchemaAttDef* newWildCard = new (fMemoryManager) SchemaAttDef(baseAttWildCard);
             typeInfo->setAttWildCard(newWildCard);
         }
     }
@@ -6145,7 +6153,7 @@ void TraverseSchema::processAttributes(const DOMElement* const elem,
 
             if (attDef.getDefaultType() != XMLAttDef::Prohibited) {
 
-                SchemaAttDef* newAttDef = new SchemaAttDef(attName->getPrefix(),
+                SchemaAttDef* newAttDef = new (fMemoryManager) SchemaAttDef(attName->getPrefix(),
                                                            attName->getLocalPart(),
                                                            attName->getURI(),
                                                            attDef.getValue(),
@@ -6203,13 +6211,13 @@ InputSource* TraverseSchema::resolveSchemaLocation(const XMLCh* const loc) {
             else {
                 if (fScanner->getStandardUriConformant() && urlTmp.hasInvalidChar())
                     ThrowXML(MalformedURLException, XMLExcepts::URL_MalformedURL);
-                srcToFill = new URLInputSource(urlTmp);
+                srcToFill = new (fMemoryManager) URLInputSource(urlTmp);
             }
         }
         catch(const MalformedURLException& e) {
             // Its not a URL, so lets assume its a local file name if non-standard URI is allowed
             if (!fScanner->getStandardUriConformant())
-                srcToFill = new LocalFileInputSource(fSchemaInfo->getCurrentSchemaURL(),normalizedURI);
+                srcToFill = new (fMemoryManager) LocalFileInputSource(fSchemaInfo->getCurrentSchemaURL(),normalizedURI);
             else
                 throw e;
         }
@@ -6337,7 +6345,7 @@ TraverseSchema::buildValidSubstitutionListB(const DOMElement* const elem,
                 break;
             }
 			
-            validSubsElements = new ValueVectorOf<SchemaElementDecl*>(*validSubsElements);
+            validSubsElements = new (fMemoryManager) ValueVectorOf<SchemaElementDecl*>(*validSubsElements);
             fValidSubstitutionGroups->put((void*) chainElemName, chainElemURI, validSubsElements);
         }
 
@@ -6401,7 +6409,7 @@ TraverseSchema::buildValidSubstitutionListF(const DOMElement* const elem,
                 return;
             }
 			
-            validSubs = new ValueVectorOf<SchemaElementDecl*>(*validSubs);
+            validSubs = new (fMemoryManager) ValueVectorOf<SchemaElementDecl*>(*validSubs);
             fValidSubstitutionGroups->put((void*) subsElemName, subsElemURI, validSubs);
         }
 
@@ -6776,7 +6784,7 @@ void TraverseSchema::copyAttGroupAttributes(const DOMElement* const elem,
                 typeInfo->setAttWithTypeId(true);
             }
 
-            typeInfo->addAttDef(new SchemaAttDef(attDef));
+            typeInfo->addAttDef(new (fMemoryManager) SchemaAttDef(attDef));
 
             if (toAttGroup) {
                 toAttGroup->addAttDef(attDef, true);
@@ -7390,7 +7398,7 @@ bool TraverseSchema::openRedefinedSchema(const DOMElement* const redefineElem) {
     // Parse input source
     // ------------------------------------------------------------------
     if (!fParser)
-        fParser = new XSDDOMParser;
+        fParser = new (fMemoryManager) XSDDOMParser;
 
     fParser->setValidationScheme(XercesDOMParser::Val_Never);
     fParser->setDoNamespaces(true);
@@ -7446,7 +7454,7 @@ bool TraverseSchema::openRedefinedSchema(const DOMElement* const redefineElem) {
         // Update schema information with redefined schema
         // --------------------------------------------------------
         redefSchemaInfo = fSchemaInfo;
-        fSchemaInfo = new SchemaInfo(0, 0, 0, fTargetNSURI, fScopeCount,
+        fSchemaInfo = new (fMemoryManager) SchemaInfo(0, 0, 0, fTargetNSURI, fScopeCount,
                                      fNamespaceScope->increaseDepth(),
                                      XMLString::replicate(includeURL),
                                      fTargetNSURIString, root);
@@ -7917,18 +7925,21 @@ void TraverseSchema::init() {
     fDatatypeRegistry = fSchemaGrammar->getDatatypeRegistry();
     fStringPool = fGrammarResolver->getStringPool();
     fEmptyNamespaceURI = fScanner->getEmptyNamespaceId();
-    fCurrentTypeNameStack = new ValueVectorOf<unsigned int>(8);
-    fCurrentGroupStack = new ValueVectorOf<unsigned int>(8);
+    fCurrentTypeNameStack = new (fMemoryManager) ValueVectorOf<unsigned int>(8);
+    fCurrentGroupStack = new (fMemoryManager) ValueVectorOf<unsigned int>(8);
 
-    fGlobalDeclarations = new ValueVectorOf<unsigned int>*[ENUM_ELT_SIZE];
+    fGlobalDeclarations = (ValueVectorOf<unsigned int>**) fMemoryManager->allocate
+    (
+        ENUM_ELT_SIZE * sizeof(ValueVectorOf<unsigned int>*)
+    );//new ValueVectorOf<unsigned int>*[ENUM_ELT_SIZE];
     for(unsigned int i=0; i < ENUM_ELT_SIZE; i++)
-        fGlobalDeclarations[i] = new ValueVectorOf<unsigned int>(8);
+        fGlobalDeclarations[i] = new (fMemoryManager) ValueVectorOf<unsigned int>(8);
 
-    fNotationRegistry = new RefHash2KeysTableOf<XMLCh>(13, false);
-    fSchemaInfoList = new RefHash2KeysTableOf<SchemaInfo>(29);
-    fPreprocessedNodes = new RefHashTableOf<SchemaInfo>(29, false, new HashPtr());
+    fNotationRegistry = new (fMemoryManager) RefHash2KeysTableOf<XMLCh>(13, false);
+    fSchemaInfoList = new (fMemoryManager) RefHash2KeysTableOf<SchemaInfo>(29);
+    fPreprocessedNodes = new (fMemoryManager) RefHashTableOf<SchemaInfo>(29, false, new (fMemoryManager) HashPtr());
     fLocator = new XSDLocator();
-    fDeclStack = new ValueVectorOf<const DOMElement*>(16);
+    fDeclStack = new (fMemoryManager) ValueVectorOf<const DOMElement*>(16);
 }
 
 void TraverseSchema::cleanUp() {
@@ -7940,7 +7951,7 @@ void TraverseSchema::cleanUp() {
     for(unsigned int i=0; i < ENUM_ELT_SIZE; i++)
         delete fGlobalDeclarations[i];
 
-    delete [] fGlobalDeclarations;
+    fMemoryManager->deallocate(fGlobalDeclarations);//delete [] fGlobalDeclarations;
 
     delete fNotationRegistry;
     delete fRedefineComponents;
diff --git a/src/xercesc/validators/schema/TraverseSchema.hpp b/src/xercesc/validators/schema/TraverseSchema.hpp
index 19d39f921..49cfd7016 100644
--- a/src/xercesc/validators/schema/TraverseSchema.hpp
+++ b/src/xercesc/validators/schema/TraverseSchema.hpp
@@ -107,7 +107,7 @@ class XSDDOMParser;
 class XMLErrorReporter;
 
 
-class VALIDATORS_EXPORT TraverseSchema
+class VALIDATORS_EXPORT TraverseSchema : public XMemory
 {
 public:
     // -----------------------------------------------------------------------
@@ -123,6 +123,7 @@ public:
         , const XMLCh* const      schemaURL
         , XMLEntityHandler* const entityHandler
         , XMLErrorReporter* const errorReporter
+        , MemoryManager* const    manager
     );
 
     ~TraverseSchema();
@@ -773,10 +774,11 @@ private:
     RefHash2KeysTableOf<IdentityConstraint>*       fIdentityConstraintNames;
     RefHash2KeysTableOf<ElemVector>*               fValidSubstitutionGroups;
     RefHash2KeysTableOf<SchemaInfo>*               fSchemaInfoList;
-    GeneralAttributeCheck                          fAttributeCheck;
     XSDDOMParser*                                  fParser;
     XSDErrorReporter                               fXSDErrorReporter;
     XSDLocator*                                    fLocator;
+    MemoryManager*                                 fMemoryManager;
+    GeneralAttributeCheck                          fAttributeCheck;
 
     friend class GeneralAttributeCheck;
 };
diff --git a/src/xercesc/validators/schema/XSDDOMParser.cpp b/src/xercesc/validators/schema/XSDDOMParser.cpp
index e793fa48c..ced05a3a9 100644
--- a/src/xercesc/validators/schema/XSDDOMParser.cpp
+++ b/src/xercesc/validators/schema/XSDDOMParser.cpp
@@ -72,8 +72,9 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  XSDDOMParser: Constructors and Destructor
 // ---------------------------------------------------------------------------
-XSDDOMParser::XSDDOMParser(XMLValidator* const valToAdopt) :
-    XercesDOMParser(valToAdopt)
+XSDDOMParser::XSDDOMParser( XMLValidator* const  valToAdopt
+                          , MemoryManager* const manager) :
+    XercesDOMParser(valToAdopt, manager)
     , fSawFatal(false)
     , fUserErrorReporter(0)
 {
diff --git a/src/xercesc/validators/schema/XSDDOMParser.hpp b/src/xercesc/validators/schema/XSDDOMParser.hpp
index c54d8e357..991f3435d 100644
--- a/src/xercesc/validators/schema/XSDDOMParser.hpp
+++ b/src/xercesc/validators/schema/XSDDOMParser.hpp
@@ -93,7 +93,11 @@ public :
       * @param valToAdopt Pointer to the validator instance to use. The
       *                   parser is responsible for freeing the memory.
       */
-    XSDDOMParser(XMLValidator* const valToAdopt = 0);
+    XSDDOMParser
+    (
+          XMLValidator* const  valToAdopt = 0
+        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+    );
 
     /**
       * Destructor
diff --git a/src/xercesc/validators/schema/XSDErrorReporter.hpp b/src/xercesc/validators/schema/XSDErrorReporter.hpp
index bd2dea4df..0554d9f87 100644
--- a/src/xercesc/validators/schema/XSDErrorReporter.hpp
+++ b/src/xercesc/validators/schema/XSDErrorReporter.hpp
@@ -62,7 +62,7 @@
 #if !defined(XSDERRORREPORTER_HPP)
 #define XSDERRORREPORTER_HPP
 
-#include <xercesc/util/XercesDefs.hpp>
+#include <xercesc/util/XMemory.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -73,7 +73,7 @@ class XMLErrorReporter;
 /**
  *  This class reports schema errors
  */
-class VALIDATORS_EXPORT XSDErrorReporter
+class VALIDATORS_EXPORT XSDErrorReporter : public XMemory
 {
 public:
     // -----------------------------------------------------------------------
diff --git a/src/xercesc/validators/schema/XercesAttGroupInfo.cpp b/src/xercesc/validators/schema/XercesAttGroupInfo.cpp
index 64b05d365..97b12cf76 100644
--- a/src/xercesc/validators/schema/XercesAttGroupInfo.cpp
+++ b/src/xercesc/validators/schema/XercesAttGroupInfo.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.4  2003/05/15 18:57:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/11/04 14:49:42  tng
  * C++ Namespace Support.
  *
@@ -90,11 +93,12 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  XercesAttGroupInfo: Constructors and Destructor
 // ---------------------------------------------------------------------------
-XercesAttGroupInfo::XercesAttGroupInfo()
+XercesAttGroupInfo::XercesAttGroupInfo(MemoryManager* const manager)
     : fTypeWithId(false)
     , fAttributes(0)
     , fAnyAttributes(0)
     , fCompleteWildCard(0)
+    , fMemoryManager(manager)
 {
 
 }
diff --git a/src/xercesc/validators/schema/XercesAttGroupInfo.hpp b/src/xercesc/validators/schema/XercesAttGroupInfo.hpp
index 0ee1ec505..bed00b681 100644
--- a/src/xercesc/validators/schema/XercesAttGroupInfo.hpp
+++ b/src/xercesc/validators/schema/XercesAttGroupInfo.hpp
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 2001 The Apache Software Foundation.  All rights
+ * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -76,13 +76,13 @@
 
 XERCES_CPP_NAMESPACE_BEGIN
 
-class VALIDATORS_EXPORT XercesAttGroupInfo
+class VALIDATORS_EXPORT XercesAttGroupInfo : public XMemory
 {
 public:
     // -----------------------------------------------------------------------
     //  Public Constructors/Destructor
     // -----------------------------------------------------------------------
-    XercesAttGroupInfo();
+    XercesAttGroupInfo(MemoryManager* const manager);
 	~XercesAttGroupInfo();
 
 	// -----------------------------------------------------------------------
@@ -126,6 +126,7 @@ private:
     RefVectorOf<SchemaAttDef>* fAttributes;
     RefVectorOf<SchemaAttDef>* fAnyAttributes;
     SchemaAttDef*              fCompleteWildCard;
+    MemoryManager*             fMemoryManager;
 };
 
 // ---------------------------------------------------------------------------
@@ -212,11 +213,11 @@ inline void XercesAttGroupInfo::addAttDef(SchemaAttDef* const toAdd,
                                              const bool toClone) {
 
     if (!fAttributes) {
-        fAttributes = new RefVectorOf<SchemaAttDef>(4);
+        fAttributes = new (fMemoryManager) RefVectorOf<SchemaAttDef>(4);
     }
 
     if (toClone) {
-        fAttributes->addElement(new SchemaAttDef(toAdd));
+        fAttributes->addElement(new (fMemoryManager) SchemaAttDef(toAdd));
     }
     else {
         fAttributes->addElement(toAdd);
@@ -227,11 +228,11 @@ inline void XercesAttGroupInfo::addAnyAttDef(SchemaAttDef* const toAdd,
                                              const bool toClone) {
 
     if (!fAnyAttributes) {
-        fAnyAttributes = new RefVectorOf<SchemaAttDef>(2);
+        fAnyAttributes = new (fMemoryManager) RefVectorOf<SchemaAttDef>(2);
     }
 
     if (toClone) {
-        fAnyAttributes->addElement(new SchemaAttDef(toAdd));
+        fAnyAttributes->addElement(new (fMemoryManager) SchemaAttDef(toAdd));
     }
     else {
         fAnyAttributes->addElement(toAdd);
diff --git a/src/xercesc/validators/schema/XercesGroupInfo.cpp b/src/xercesc/validators/schema/XercesGroupInfo.cpp
index 796383d7f..db512c5cb 100644
--- a/src/xercesc/validators/schema/XercesGroupInfo.cpp
+++ b/src/xercesc/validators/schema/XercesGroupInfo.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.5  2003/05/15 18:57:27  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.4  2002/11/04 14:49:42  tng
  * C++ Namespace Support.
  *
@@ -88,7 +91,7 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  XercesGroupInfo: Constructors and Destructor
 // ---------------------------------------------------------------------------
-XercesGroupInfo::XercesGroupInfo()
+XercesGroupInfo::XercesGroupInfo(MemoryManager* const manager)
     : fCheckElementConsistency(true)
     , fScope(-1)
     , fContentSpec(0)
@@ -96,7 +99,7 @@ XercesGroupInfo::XercesGroupInfo()
     , fBaseGroup(0)
     , fLocator(0)
 {
-    fElements = new RefVectorOf<SchemaElementDecl>(4, false);
+    fElements = new (manager) RefVectorOf<SchemaElementDecl>(4, false);
 }
 
 
diff --git a/src/xercesc/validators/schema/XercesGroupInfo.hpp b/src/xercesc/validators/schema/XercesGroupInfo.hpp
index bc499929d..d17e242da 100644
--- a/src/xercesc/validators/schema/XercesGroupInfo.hpp
+++ b/src/xercesc/validators/schema/XercesGroupInfo.hpp
@@ -83,13 +83,13 @@ class ContentSpecNode;
 class XSDLocator;
 
 
-class VALIDATORS_EXPORT XercesGroupInfo
+class VALIDATORS_EXPORT XercesGroupInfo : public XMemory
 {
 public:
     // -----------------------------------------------------------------------
     //  Public Constructors/Destructor
     // -----------------------------------------------------------------------
-    XercesGroupInfo();
+    XercesGroupInfo(MemoryManager* const manager);
 	~XercesGroupInfo();
 
 	// -----------------------------------------------------------------------
diff --git a/src/xercesc/validators/schema/identity/FieldActivator.cpp b/src/xercesc/validators/schema/identity/FieldActivator.cpp
index 9fc0fa301..96940197e 100644
--- a/src/xercesc/validators/schema/identity/FieldActivator.cpp
+++ b/src/xercesc/validators/schema/identity/FieldActivator.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.4  2003/05/15 18:59:34  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/11/04 14:47:41  tng
  * C++ Namespace Support.
  *
@@ -84,15 +87,18 @@ XERCES_CPP_NAMESPACE_BEGIN
 //  FieldActivator: Constructors and Destructor
 // ---------------------------------------------------------------------------
 FieldActivator::FieldActivator(ValueStoreCache* const valueStoreCache,
-                               XPathMatcherStack* const matcherStack)
+                               XPathMatcherStack* const matcherStack,
+                               MemoryManager* const manager)
     : fValueStoreCache(valueStoreCache)
     , fMatcherStack(matcherStack)
+    , fMemoryManager(manager)
 {
 }
 
 FieldActivator::FieldActivator(const FieldActivator& other)
     : fValueStoreCache(other.fValueStoreCache)
     , fMatcherStack(other.fMatcherStack)
+    , fMemoryManager(XMLPlatformUtils::fgMemoryManager)
 {
 }
 
@@ -121,7 +127,7 @@ FieldActivator& FieldActivator::operator =(const FieldActivator& other) {
 XPathMatcher* FieldActivator::activateField(IC_Field* const field, const int initialDepth) {
 
     ValueStore* valueStore = fValueStoreCache->getValueStoreFor(field, initialDepth);
-    XPathMatcher* matcher = field->createMatcher(valueStore);
+    XPathMatcher* matcher = field->createMatcher(valueStore, fMemoryManager);
 
     field->setMayMatch(true);
     fMatcherStack->addMatcher(matcher);
diff --git a/src/xercesc/validators/schema/identity/FieldActivator.hpp b/src/xercesc/validators/schema/identity/FieldActivator.hpp
index 79ba13fc8..49f5444ff 100644
--- a/src/xercesc/validators/schema/identity/FieldActivator.hpp
+++ b/src/xercesc/validators/schema/identity/FieldActivator.hpp
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 2001 The Apache Software Foundation.  All rights
+ * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -69,7 +69,7 @@
 // ---------------------------------------------------------------------------
 //  Includes
 // ---------------------------------------------------------------------------
-#include <xercesc/util/XercesDefs.hpp>
+#include <xercesc/util/XMemory.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -83,14 +83,15 @@ class IC_Field;
 class XPathMatcherStack;
 
 
-class VALIDATORS_EXPORT FieldActivator
+class VALIDATORS_EXPORT FieldActivator : public XMemory
 {
 public:
     // -----------------------------------------------------------------------
     //  Constructors/Destructor
     // -----------------------------------------------------------------------
     FieldActivator(ValueStoreCache* const valueStoreCache,
-                   XPathMatcherStack* const matcherStack);
+                   XPathMatcherStack* const matcherStack,
+                   MemoryManager* const manager);
 	FieldActivator(const FieldActivator& other);
 	~FieldActivator();
 
@@ -132,6 +133,7 @@ private:
     // -----------------------------------------------------------------------
     ValueStoreCache*   fValueStoreCache;
     XPathMatcherStack* fMatcherStack;
+    MemoryManager*     fMemoryManager;
 };
 
 
diff --git a/src/xercesc/validators/schema/identity/FieldValueMap.cpp b/src/xercesc/validators/schema/identity/FieldValueMap.cpp
index 2b99c9cf7..79410c5dc 100644
--- a/src/xercesc/validators/schema/identity/FieldValueMap.cpp
+++ b/src/xercesc/validators/schema/identity/FieldValueMap.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.4  2003/05/15 18:59:34  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/12/18 14:17:59  gareth
  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  *
@@ -80,10 +83,11 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  FieldValueMap: Constructors and Destructor
 // ---------------------------------------------------------------------------
-FieldValueMap::FieldValueMap()
+FieldValueMap::FieldValueMap(MemoryManager* const manager)
     : fFields(0)
     , fValidators(0)
     , fValues(0)
+    , fMemoryManager(manager)
 {
 }
 
@@ -91,15 +95,16 @@ FieldValueMap::FieldValueMap(const FieldValueMap& other)
     : fFields(0)
     , fValidators(0)
     , fValues(0)
+    , fMemoryManager(XMLPlatformUtils::fgMemoryManager)
 {
     try {
         if (other.fFields) {
 
             unsigned int valuesSize = other.fValues->size();
 
-            fFields = new ValueVectorOf<IC_Field*>(*(other.fFields));
-            fValidators = new ValueVectorOf<DatatypeValidator*>(*(other.fValidators));
-            fValues = new RefArrayVectorOf<XMLCh>(other.fFields->curCapacity());
+            fFields = new (fMemoryManager) ValueVectorOf<IC_Field*>(*(other.fFields));
+            fValidators = new (fMemoryManager) ValueVectorOf<DatatypeValidator*>(*(other.fValidators));
+            fValues = new (fMemoryManager) RefArrayVectorOf<XMLCh>(other.fFields->curCapacity());
 
             for (unsigned int i=0; i<valuesSize; i++) {
                 fValues->addElement(XMLString::replicate(other.fValues->elementAt(i)));
diff --git a/src/xercesc/validators/schema/identity/FieldValueMap.hpp b/src/xercesc/validators/schema/identity/FieldValueMap.hpp
index 0ee9fd1f5..12f1c54bc 100644
--- a/src/xercesc/validators/schema/identity/FieldValueMap.hpp
+++ b/src/xercesc/validators/schema/identity/FieldValueMap.hpp
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 2001 The Apache Software Foundation.  All rights
+ * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -82,13 +82,13 @@ class IC_Field;
 class DatatypeValidator;
 
 
-class VALIDATORS_EXPORT FieldValueMap
+class VALIDATORS_EXPORT FieldValueMap : public XMemory
 {
 public:
     // -----------------------------------------------------------------------
     //  Constructors/Destructor
     // -----------------------------------------------------------------------
-    FieldValueMap();
+    FieldValueMap(MemoryManager* const manager);
     FieldValueMap(const FieldValueMap& other);
 	~FieldValueMap();
 
@@ -125,6 +125,7 @@ private:
     ValueVectorOf<IC_Field*>*          fFields;
     ValueVectorOf<DatatypeValidator*>* fValidators;
     RefArrayVectorOf<XMLCh>*           fValues;
+    MemoryManager*                     fMemoryManager;
 };
 
 
@@ -198,9 +199,9 @@ inline void FieldValueMap::put(IC_Field* const key,
                                const XMLCh* const value) {
 
     if (!fFields) {
-        fFields = new ValueVectorOf<IC_Field*>(4);
-        fValidators = new ValueVectorOf<DatatypeValidator*>(4);
-        fValues = new RefArrayVectorOf<XMLCh>(4);
+        fFields = new (fMemoryManager) ValueVectorOf<IC_Field*>(4);
+        fValidators = new (fMemoryManager) ValueVectorOf<DatatypeValidator*>(4);
+        fValues = new (fMemoryManager) RefArrayVectorOf<XMLCh>(4);
     }
 
     int keyIndex = indexOf(key);
diff --git a/src/xercesc/validators/schema/identity/IC_Field.cpp b/src/xercesc/validators/schema/identity/IC_Field.cpp
index 813fe5f72..145c02dfb 100644
--- a/src/xercesc/validators/schema/identity/IC_Field.cpp
+++ b/src/xercesc/validators/schema/identity/IC_Field.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.4  2003/05/15 18:59:34  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2003/01/13 16:30:19  knoaman
  * [Bug 14469] Validator doesn't enforce xsd:key.
  *
@@ -85,9 +88,11 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  FieldMatcher: Constructors and Destructor
 // ---------------------------------------------------------------------------
-FieldMatcher::FieldMatcher(XercesXPath* const xpath, IC_Field* const aField,
-                           ValueStore* const valueStore)
-    : XPathMatcher(xpath, 0)
+FieldMatcher::FieldMatcher(XercesXPath* const xpath,
+                           IC_Field* const aField,
+                           ValueStore* const valueStore,
+                           MemoryManager* const manager)
+    : XPathMatcher(xpath, (IdentityConstraint*) 0, manager)
     , fField(aField)
     , fValueStore(valueStore)
 {
@@ -144,9 +149,10 @@ bool IC_Field::operator!= (const IC_Field& other) const {
 // ---------------------------------------------------------------------------
 //  IC_Field: Factory methods
 // ---------------------------------------------------------------------------
-XPathMatcher* IC_Field::createMatcher(ValueStore* const valueStore) {
+XPathMatcher* IC_Field::createMatcher(ValueStore* const valueStore,
+                                      MemoryManager* const manager) {
 
-    return new FieldMatcher(fXPath, this, valueStore);
+    return new (manager) FieldMatcher(fXPath, this, valueStore, manager);
 }
 
 XERCES_CPP_NAMESPACE_END
diff --git a/src/xercesc/validators/schema/identity/IC_Field.hpp b/src/xercesc/validators/schema/identity/IC_Field.hpp
index 1a60b59c4..79f804c5e 100644
--- a/src/xercesc/validators/schema/identity/IC_Field.hpp
+++ b/src/xercesc/validators/schema/identity/IC_Field.hpp
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 2001 The Apache Software Foundation.  All rights
+ * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -75,7 +75,7 @@ XERCES_CPP_NAMESPACE_BEGIN
 class ValueStore;
 
 
-class VALIDATORS_EXPORT IC_Field
+class VALIDATORS_EXPORT IC_Field : public XMemory
 {
 public:
     // -----------------------------------------------------------------------
@@ -106,7 +106,8 @@ public:
 	// -----------------------------------------------------------------------
     //  Factory methods
     // -----------------------------------------------------------------------
-    XPathMatcher* createMatcher(ValueStore* const valueStore);
+    XPathMatcher* createMatcher(ValueStore* const valueStore,
+                                MemoryManager* const manager);
 
 private:
     // -----------------------------------------------------------------------
@@ -148,8 +149,10 @@ private:
     // -----------------------------------------------------------------------
     //  Constructors/Destructor
     // -----------------------------------------------------------------------
-    FieldMatcher(XercesXPath* const anXPath, IC_Field* const aField,
-                 ValueStore* const valueStore);
+    FieldMatcher(XercesXPath* const anXPath,
+                 IC_Field* const aField,
+                 ValueStore* const valueStore,
+                 MemoryManager* const manager);
 
     // -----------------------------------------------------------------------
     //  Unimplemented contstructors and operators
diff --git a/src/xercesc/validators/schema/identity/IC_Key.cpp b/src/xercesc/validators/schema/identity/IC_Key.cpp
index fe0702bda..088451bae 100644
--- a/src/xercesc/validators/schema/identity/IC_Key.cpp
+++ b/src/xercesc/validators/schema/identity/IC_Key.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.3  2003/05/15 18:59:34  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.2  2002/11/04 14:47:41  tng
  * C++ Namespace Support.
  *
@@ -78,8 +81,9 @@ XERCES_CPP_NAMESPACE_BEGIN
 //  IC_Key: Constructors and Destructor
 // ---------------------------------------------------------------------------
 IC_Key::IC_Key(const XMLCh* const identityConstraintName,
-               const XMLCh* const elemName)
-    : IdentityConstraint(identityConstraintName, elemName)
+               const XMLCh* const elemName,
+			   MemoryManager* const manager)
+    : IdentityConstraint(identityConstraintName, elemName, manager)
 {
 }
 
diff --git a/src/xercesc/validators/schema/identity/IC_Key.hpp b/src/xercesc/validators/schema/identity/IC_Key.hpp
index 20f582445..d07cc7076 100644
--- a/src/xercesc/validators/schema/identity/IC_Key.hpp
+++ b/src/xercesc/validators/schema/identity/IC_Key.hpp
@@ -76,7 +76,8 @@ public:
     //  Constructors/Destructor
     // -----------------------------------------------------------------------
     IC_Key(const XMLCh* const identityConstraintName,
-           const XMLCh* const elemName);
+           const XMLCh* const elemName,
+           MemoryManager* const manager);
 	~IC_Key();
 
 	// -----------------------------------------------------------------------
diff --git a/src/xercesc/validators/schema/identity/IC_KeyRef.cpp b/src/xercesc/validators/schema/identity/IC_KeyRef.cpp
index 89b4b77dd..129aab7f4 100644
--- a/src/xercesc/validators/schema/identity/IC_KeyRef.cpp
+++ b/src/xercesc/validators/schema/identity/IC_KeyRef.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.3  2003/05/15 18:59:34  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.2  2002/11/04 14:47:41  tng
  * C++ Namespace Support.
  *
@@ -79,8 +82,9 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 IC_KeyRef::IC_KeyRef(const XMLCh* const identityConstraintName,
                      const XMLCh* const elemName,
-                     IdentityConstraint* const icKey)
-    : IdentityConstraint(identityConstraintName, elemName)
+                     IdentityConstraint* const icKey,
+                     MemoryManager* const manager)
+    : IdentityConstraint(identityConstraintName, elemName, manager)
     , fKey(icKey)
 {
 }
diff --git a/src/xercesc/validators/schema/identity/IC_KeyRef.hpp b/src/xercesc/validators/schema/identity/IC_KeyRef.hpp
index f17d6ddeb..2814af953 100644
--- a/src/xercesc/validators/schema/identity/IC_KeyRef.hpp
+++ b/src/xercesc/validators/schema/identity/IC_KeyRef.hpp
@@ -77,7 +77,8 @@ public:
     // -----------------------------------------------------------------------
     IC_KeyRef(const XMLCh* const identityConstraintName,
               const XMLCh* const elemName,
-              IdentityConstraint* const icKey);
+              IdentityConstraint* const icKey,
+              MemoryManager* const manager);
 	~IC_KeyRef();
 
 	// -----------------------------------------------------------------------
diff --git a/src/xercesc/validators/schema/identity/IC_Selector.cpp b/src/xercesc/validators/schema/identity/IC_Selector.cpp
index 25954f93a..fb8d281ac 100644
--- a/src/xercesc/validators/schema/identity/IC_Selector.cpp
+++ b/src/xercesc/validators/schema/identity/IC_Selector.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.5  2003/05/15 18:59:34  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.4  2003/01/13 16:30:19  knoaman
  * [Bug 14469] Validator doesn't enforce xsd:key.
  *
@@ -96,8 +99,9 @@ XERCES_CPP_NAMESPACE_BEGIN
 SelectorMatcher::SelectorMatcher(XercesXPath* const xpath,
                                  IC_Selector* const selector,
                                  FieldActivator* const fieldActivator,
-                                 const int initialDepth)
-    : XPathMatcher(xpath, selector->getIdentityConstraint())
+                                 const int initialDepth,
+                                 MemoryManager* const manager)
+    : XPathMatcher(xpath, selector->getIdentityConstraint(), manager)
     , fInitialDepth(initialDepth)
     , fElementDepth(0)
     , fMatchedDepth(-1)
@@ -188,9 +192,11 @@ bool IC_Selector::operator !=(const IC_Selector& other) const {
 // ---------------------------------------------------------------------------
 //  IC_Selector: Factory methods
 // ---------------------------------------------------------------------------
-XPathMatcher* IC_Selector::createMatcher(FieldActivator* const fieldActivator, const int initialDepth) {
+XPathMatcher* IC_Selector::createMatcher(FieldActivator* const fieldActivator,
+                                         const int initialDepth,
+                                         MemoryManager* const manager) {
 
-    return new SelectorMatcher(fXPath, this, fieldActivator, initialDepth);
+    return new (manager) SelectorMatcher(fXPath, this, fieldActivator, initialDepth, manager);
 }
 
 XERCES_CPP_NAMESPACE_END
diff --git a/src/xercesc/validators/schema/identity/IC_Selector.hpp b/src/xercesc/validators/schema/identity/IC_Selector.hpp
index 395277a83..8a3b28c3c 100644
--- a/src/xercesc/validators/schema/identity/IC_Selector.hpp
+++ b/src/xercesc/validators/schema/identity/IC_Selector.hpp
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 2001 The Apache Software Foundation.  All rights
+ * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -75,7 +75,7 @@ XERCES_CPP_NAMESPACE_BEGIN
 class FieldActivator;
 
 
-class VALIDATORS_EXPORT IC_Selector
+class VALIDATORS_EXPORT IC_Selector : public XMemory
 {
 public:
     // -----------------------------------------------------------------------
@@ -100,7 +100,9 @@ public:
 	// -----------------------------------------------------------------------
     //  Factory methods
     // -----------------------------------------------------------------------
-    XPathMatcher* createMatcher(FieldActivator* const fieldActivator, const int initialDepth);
+    XPathMatcher* createMatcher(FieldActivator* const fieldActivator,
+                                const int initialDepth,
+                                MemoryManager* const manager);
 
 private:
     // -----------------------------------------------------------------------
@@ -143,8 +145,11 @@ private:
     // -----------------------------------------------------------------------
     //  Constructors/Destructor
     // -----------------------------------------------------------------------
-    SelectorMatcher(XercesXPath* const anXPath, IC_Selector* const selector,
-                    FieldActivator* const fieldActivator, const int initialDepth);
+    SelectorMatcher(XercesXPath* const anXPath,
+                    IC_Selector* const selector,
+                    FieldActivator* const fieldActivator,
+                    const int initialDepth,
+                    MemoryManager* const manager);
 
     // -----------------------------------------------------------------------
     //  Unimplemented contstructors and operators
diff --git a/src/xercesc/validators/schema/identity/IC_Unique.cpp b/src/xercesc/validators/schema/identity/IC_Unique.cpp
index e95c2cd97..6fecd2cf1 100644
--- a/src/xercesc/validators/schema/identity/IC_Unique.cpp
+++ b/src/xercesc/validators/schema/identity/IC_Unique.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.3  2003/05/15 18:59:34  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.2  2002/11/04 14:47:41  tng
  * C++ Namespace Support.
  *
@@ -78,8 +81,9 @@ XERCES_CPP_NAMESPACE_BEGIN
 //  IC_Unique: Constructors and Destructor
 // ---------------------------------------------------------------------------
 IC_Unique::IC_Unique(const XMLCh* const identityConstraintName,
-                     const XMLCh* const elemName)
-    : IdentityConstraint(identityConstraintName, elemName)
+                     const XMLCh* const elemName,
+                     MemoryManager* const manager)
+    : IdentityConstraint(identityConstraintName, elemName, manager)
 {
 }
 
diff --git a/src/xercesc/validators/schema/identity/IC_Unique.hpp b/src/xercesc/validators/schema/identity/IC_Unique.hpp
index f47cc4aa6..91dbc51e9 100644
--- a/src/xercesc/validators/schema/identity/IC_Unique.hpp
+++ b/src/xercesc/validators/schema/identity/IC_Unique.hpp
@@ -80,7 +80,8 @@ public:
     //  Constructors/Destructor
     // -----------------------------------------------------------------------
     IC_Unique(const XMLCh* const identityConstraintName,
-              const XMLCh* const elemName);
+              const XMLCh* const elemName,
+              MemoryManager* const manager);
 	~IC_Unique();
 
 	// -----------------------------------------------------------------------
diff --git a/src/xercesc/validators/schema/identity/IdentityConstraint.cpp b/src/xercesc/validators/schema/identity/IdentityConstraint.cpp
index 519b4908d..53bab02e1 100644
--- a/src/xercesc/validators/schema/identity/IdentityConstraint.cpp
+++ b/src/xercesc/validators/schema/identity/IdentityConstraint.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.4  2003/05/15 18:59:34  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.3  2002/11/04 14:47:41  tng
  * C++ Namespace Support.
  *
@@ -87,14 +90,17 @@ XERCES_CPP_NAMESPACE_BEGIN
 //  IdentityConstraint: Constructors and Destructor
 // ---------------------------------------------------------------------------
 IdentityConstraint::IdentityConstraint(const XMLCh* const identityConstraintName,
-                                       const XMLCh* const elemName)
-    : fIdentityConstraintName(XMLString::replicate(identityConstraintName))
+                                       const XMLCh* const elemName,
+                                       MemoryManager* const manager)
+    : fIdentityConstraintName(0)
     , fElemName(0)
     , fSelector(0)
     , fFields(0)
+    , fMemoryManager(manager)
 {
     try {
-        fElemName = XMLString::replicate(elemName);
+        fIdentityConstraintName = XMLString::replicate(identityConstraintName, fMemoryManager);
+        fElemName = XMLString::replicate(elemName, fMemoryManager);
     }
     catch(...) {
 
@@ -159,8 +165,8 @@ void IdentityConstraint::setSelector(IC_Selector* const selector) {
 // ---------------------------------------------------------------------------
 void IdentityConstraint::cleanUp() {
 
-    delete [] fIdentityConstraintName;
-    delete [] fElemName;
+    fMemoryManager->deallocate(fIdentityConstraintName);//delete [] fIdentityConstraintName;
+    fMemoryManager->deallocate(fElemName);//delete [] fElemName;
     delete fFields;
     delete fSelector;
 }
diff --git a/src/xercesc/validators/schema/identity/IdentityConstraint.hpp b/src/xercesc/validators/schema/identity/IdentityConstraint.hpp
index eb2c7127d..552c1ac82 100644
--- a/src/xercesc/validators/schema/identity/IdentityConstraint.hpp
+++ b/src/xercesc/validators/schema/identity/IdentityConstraint.hpp
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 2001 The Apache Software Foundation.  All rights
+ * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -79,7 +79,7 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 class IC_Selector;
 
-class VALIDATORS_EXPORT IdentityConstraint
+class VALIDATORS_EXPORT IdentityConstraint : public XMemory
 {
 public:
     // -----------------------------------------------------------------------
@@ -128,7 +128,8 @@ protected:
     //  Constructors/Destructor
     // -----------------------------------------------------------------------
     IdentityConstraint(const XMLCh* const identityConstraintName,
-                       const XMLCh* const elementName);
+                       const XMLCh* const elementName,
+					   MemoryManager* const manager);
 
 private:
     // -----------------------------------------------------------------------
@@ -161,6 +162,7 @@ private:
     XMLCh*                 fElemName;
     IC_Selector*           fSelector;
     RefVectorOf<IC_Field>* fFields;
+    MemoryManager*         fMemoryManager;
 };
 
 
@@ -197,7 +199,7 @@ inline IC_Selector* IdentityConstraint::getSelector() const {
 inline void IdentityConstraint::addField(IC_Field* const field) {
 
     if (!fFields) {
-        fFields = new RefVectorOf<IC_Field>(4);
+        fFields = new (fMemoryManager) RefVectorOf<IC_Field>(4);
     }
 
     fFields->addElement(field);
diff --git a/src/xercesc/validators/schema/identity/ValueStore.cpp b/src/xercesc/validators/schema/identity/ValueStore.cpp
index 6e37e8fef..85285e2a6 100644
--- a/src/xercesc/validators/schema/identity/ValueStore.cpp
+++ b/src/xercesc/validators/schema/identity/ValueStore.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.6  2003/05/15 18:59:34  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.5  2002/12/04 02:32:43  knoaman
  * #include cleanup.
  *
@@ -99,13 +102,16 @@ XERCES_CPP_NAMESPACE_BEGIN
 //  ValueStore: Constructors and Destructor
 // ---------------------------------------------------------------------------
 ValueStore::ValueStore(IdentityConstraint* const ic,
-                       XMLScanner* const scanner)
+                       XMLScanner* const scanner,
+                       MemoryManager* const manager)
     : fDoReportError(false)
     , fValuesCount(0)
     , fIdentityConstraint(ic)
+    , fValues(manager)
     , fValueTuples(0)
     , fKeyValueStore(0)
     , fScanner(scanner)
+    , fMemoryManager(manager)
 {
 	fDoReportError = (scanner && scanner->getDoValidation());
 }
@@ -156,10 +162,10 @@ void ValueStore::addValue(IC_Field* const field,
 
         // store values
         if (!fValueTuples) {
-            fValueTuples = new RefVectorOf<FieldValueMap>(4);
+            fValueTuples = new (fMemoryManager) RefVectorOf<FieldValueMap>(4);
         }
 
-        fValueTuples->addElement(new FieldValueMap(fValues));
+        fValueTuples->addElement(new (fMemoryManager) FieldValueMap(fValues));
     }
 }
 
@@ -178,10 +184,10 @@ void ValueStore::append(const ValueStore* const other) {
         if (!contains(valueMap)) {
 
             if (!fValueTuples) {
-                fValueTuples = new RefVectorOf<FieldValueMap>(4);
+                fValueTuples = new (fMemoryManager) RefVectorOf<FieldValueMap>(4);
             }
 
-            fValueTuples->addElement(new FieldValueMap(*valueMap));
+            fValueTuples->addElement(new (fMemoryManager) FieldValueMap(*valueMap));
         }
     }
 }
diff --git a/src/xercesc/validators/schema/identity/ValueStore.hpp b/src/xercesc/validators/schema/identity/ValueStore.hpp
index 4f533339c..b10007b06 100644
--- a/src/xercesc/validators/schema/identity/ValueStore.hpp
+++ b/src/xercesc/validators/schema/identity/ValueStore.hpp
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 2001 The Apache Software Foundation.  All rights
+ * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -83,13 +83,15 @@ class XMLScanner;
 class ValueStoreCache;
 
 
-class VALIDATORS_EXPORT ValueStore
+class VALIDATORS_EXPORT ValueStore : public XMemory
 {
 public:
     // -----------------------------------------------------------------------
     //  Constructors/Destructor
     // -----------------------------------------------------------------------
-    ValueStore(IdentityConstraint* const ic, XMLScanner* const scanner);
+    ValueStore(IdentityConstraint* const ic,
+               XMLScanner* const scanner,
+               MemoryManager* const manager);
 	~ValueStore();
 
 	// -----------------------------------------------------------------------
@@ -150,6 +152,7 @@ private:
     RefVectorOf<FieldValueMap>* fValueTuples;
     ValueStore*                 fKeyValueStore;
     XMLScanner*                 fScanner; // for error reporting - REVISIT
+    MemoryManager*              fMemoryManager;
 };
 
 // ---------------------------------------------------------------------------
diff --git a/src/xercesc/validators/schema/identity/ValueStoreCache.cpp b/src/xercesc/validators/schema/identity/ValueStoreCache.cpp
index 2047ab9d1..ef8556bf4 100644
--- a/src/xercesc/validators/schema/identity/ValueStoreCache.cpp
+++ b/src/xercesc/validators/schema/identity/ValueStoreCache.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.6  2003/05/15 18:59:34  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.5  2002/11/04 14:47:41  tng
  * C++ Namespace Support.
  *
@@ -89,11 +92,13 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  ValueStoreCache: Constructors and Destructor
 // ---------------------------------------------------------------------------
-ValueStoreCache::ValueStoreCache()
+ValueStoreCache::ValueStoreCache(MemoryManager* const manager)
     : fValueStores(0)
     , fGlobalICMap(0)
     , fIC2ValueStoreMap(0)
     , fGlobalMapStack(0)
+    , fScanner(0)
+    , fMemoryManager(manager)
 {
     try {
         init();
@@ -124,7 +129,7 @@ void ValueStoreCache::startDocument() {
 void ValueStoreCache::startElement() {
 
     fGlobalMapStack->push(fGlobalICMap);
-    fGlobalICMap = new RefHashTableOf<ValueStore>(13, false, new HashPtr());
+    fGlobalICMap = new (fMemoryManager) RefHashTableOf<ValueStore>(13, false, new (fMemoryManager) HashPtr());
 }
 
 void ValueStoreCache::endElement() {
@@ -166,10 +171,10 @@ void ValueStoreCache::cleanUp() {
 
 void ValueStoreCache::init() {
 
-    fValueStores = new RefVectorOf<ValueStore>(8);
-    fGlobalICMap = new RefHashTableOf<ValueStore>(13, false, new HashPtr());
-    fIC2ValueStoreMap = new RefHash2KeysTableOf<ValueStore>(13, false, new HashPtr());
-    fGlobalMapStack = new RefStackOf<RefHashTableOf<ValueStore> >(8);
+    fValueStores = new (fMemoryManager) RefVectorOf<ValueStore>(8);
+    fGlobalICMap = new (fMemoryManager) RefHashTableOf<ValueStore>(13, false, new (fMemoryManager) HashPtr());
+    fIC2ValueStoreMap = new (fMemoryManager) RefHash2KeysTableOf<ValueStore>(13, false, new (fMemoryManager) HashPtr());
+    fGlobalMapStack = new (fMemoryManager) RefStackOf<RefHashTableOf<ValueStore> >(8);
 }
 
 void ValueStoreCache::initValueStoresFor(SchemaElementDecl* const elemDecl,
@@ -181,7 +186,7 @@ void ValueStoreCache::initValueStoresFor(SchemaElementDecl* const elemDecl,
     for (unsigned int i=0; i<icCount; i++) {
 
         IdentityConstraint* ic = elemDecl->getIdentityConstraintAt(i);
-        ValueStore* valueStore = valueStore = new ValueStore(ic, fScanner);
+        ValueStore* valueStore = valueStore = new (fMemoryManager) ValueStore(ic, fScanner, fMemoryManager);
         fValueStores->addElement(valueStore);
         fIC2ValueStoreMap->put(ic, initialDepth, valueStore);
     }
@@ -199,7 +204,7 @@ void ValueStoreCache::transplant(IdentityConstraint* const ic, const int initial
     if (currVals) {
         currVals->append(newVals);
     } else {
-        ValueStore* valueStore = new ValueStore(ic, fScanner);
+        ValueStore* valueStore = new (fMemoryManager) ValueStore(ic, fScanner, fMemoryManager);
         fValueStores->addElement(valueStore);
         valueStore->append(newVals);
         fGlobalICMap->put(ic, valueStore);
diff --git a/src/xercesc/validators/schema/identity/ValueStoreCache.hpp b/src/xercesc/validators/schema/identity/ValueStoreCache.hpp
index c4143192a..d2b758f8f 100644
--- a/src/xercesc/validators/schema/identity/ValueStoreCache.hpp
+++ b/src/xercesc/validators/schema/identity/ValueStoreCache.hpp
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 2001 The Apache Software Foundation.  All rights
+ * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -99,13 +99,13 @@ class SchemaElementDecl;
 class XMLScanner;
 
 
-class VALIDATORS_EXPORT ValueStoreCache
+class VALIDATORS_EXPORT ValueStoreCache : public XMemory
 {
 public:
     // -----------------------------------------------------------------------
     //  Constructors/Destructor
     // -----------------------------------------------------------------------
-    ValueStoreCache();
+    ValueStoreCache(MemoryManager* const manager);
 	~ValueStoreCache();
 
 	// -----------------------------------------------------------------------
@@ -164,6 +164,7 @@ private:
     RefHash2KeysTableOf<ValueStore>*         fIC2ValueStoreMap;
     RefStackOf<RefHashTableOf<ValueStore> >* fGlobalMapStack;
     XMLScanner*                              fScanner;
+    MemoryManager*                           fMemoryManager;
 };
 
 // ---------------------------------------------------------------------------
diff --git a/src/xercesc/validators/schema/identity/XPathMatcher.cpp b/src/xercesc/validators/schema/identity/XPathMatcher.cpp
index 5c06307b0..6d7ef9bcf 100644
--- a/src/xercesc/validators/schema/identity/XPathMatcher.cpp
+++ b/src/xercesc/validators/schema/identity/XPathMatcher.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.7  2003/05/15 18:59:34  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.6  2003/01/13 20:16:52  knoaman
  * [Bug 16024] SchemaSymbols.hpp conflicts C++ Builder 6 dir.h
  *
@@ -97,7 +100,8 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  XPathMatcher: Constructors and Destructor
 // ---------------------------------------------------------------------------
-XPathMatcher::XPathMatcher(XercesXPath* const xpath)
+XPathMatcher::XPathMatcher( XercesXPath* const xpath
+                          , MemoryManager* const manager)
     : fLocationPathSize(0)
     , fMatched(0)
     , fNoMatchDepth(0)
@@ -105,6 +109,7 @@ XPathMatcher::XPathMatcher(XercesXPath* const xpath)
     , fStepIndexes(0)
     , fLocationPaths(0)
     , fIdentityConstraint(0)
+    , fMemoryManager(manager)
 {
     try {
         init(xpath);
@@ -118,7 +123,8 @@ XPathMatcher::XPathMatcher(XercesXPath* const xpath)
 
 
 XPathMatcher::XPathMatcher(XercesXPath* const xpath,
-                           IdentityConstraint* const ic)
+                           IdentityConstraint* const ic,
+						   MemoryManager* const manager)
     : fLocationPathSize(0)
     , fMatched(0)
     , fNoMatchDepth(0)
@@ -126,6 +132,7 @@ XPathMatcher::XPathMatcher(XercesXPath* const xpath,
     , fStepIndexes(0)
     , fLocationPaths(0)
     , fIdentityConstraint(ic)
+    , fMemoryManager(manager)
 {
     try {
         init(xpath);
@@ -155,13 +162,22 @@ void XPathMatcher::init(XercesXPath* const xpath) {
 
         if (fLocationPathSize) {
 
-            fStepIndexes = new RefVectorOf<ValueStackOf<int> >(fLocationPathSize);
-            fCurrentStep = new int[fLocationPathSize];
-            fNoMatchDepth = new int[fLocationPathSize];
-            fMatched = new int[fLocationPathSize];
+            fStepIndexes = new (fMemoryManager) RefVectorOf<ValueStackOf<int> >(fLocationPathSize);
+            fCurrentStep = (int*) fMemoryManager->allocate
+            (
+                fLocationPathSize * sizeof(int)
+            );//new int[fLocationPathSize];
+            fNoMatchDepth = (int*) fMemoryManager->allocate
+            (
+                fLocationPathSize * sizeof(int)
+            );//new int[fLocationPathSize];
+            fMatched = (int*) fMemoryManager->allocate
+            (
+                fLocationPathSize * sizeof(int)
+            );//new int[fLocationPathSize];
 
             for(unsigned int i=0; i < fLocationPathSize; i++) {
-                fStepIndexes->addElement(new ValueStackOf<int>(8));
+                fStepIndexes->addElement(new (fMemoryManager) ValueStackOf<int>(8));
             }
         }
     }
diff --git a/src/xercesc/validators/schema/identity/XPathMatcher.hpp b/src/xercesc/validators/schema/identity/XPathMatcher.hpp
index db7cae234..d34ddd6ce 100644
--- a/src/xercesc/validators/schema/identity/XPathMatcher.hpp
+++ b/src/xercesc/validators/schema/identity/XPathMatcher.hpp
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 2001 The Apache Software Foundation.  All rights
+ * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -82,21 +82,24 @@ class XMLStringPool;
 class XercesLocationPath;
 class XMLAttr;
 
-class VALIDATORS_EXPORT XPathMatcher
+class VALIDATORS_EXPORT XPathMatcher : public XMemory
 {
 public:
     // -----------------------------------------------------------------------
     //  Constructors/Destructor
     // -----------------------------------------------------------------------
-    XPathMatcher(XercesXPath* const xpath);
     XPathMatcher(XercesXPath* const xpath,
-                 IdentityConstraint* const ic);
+                 MemoryManager* const manager);
+    XPathMatcher(XercesXPath* const xpath,
+                 IdentityConstraint* const ic,
+                 MemoryManager* const manager);
     virtual ~XPathMatcher();
 
     // -----------------------------------------------------------------------
     //  Getter methods
     // -----------------------------------------------------------------------
     IdentityConstraint* getIdentityConstraint() const { return fIdentityConstraint; }
+    MemoryManager* getMemoryManager() const { return fMemoryManager; }
 
     // -----------------------------------------------------------------------
     //  Match methods
@@ -181,6 +184,7 @@ private:
     RefVectorOf<ValueStackOf<int> >* fStepIndexes;
     RefVectorOf<XercesLocationPath>* fLocationPaths;
     IdentityConstraint*              fIdentityConstraint;
+    MemoryManager*                   fMemoryManager;
 };
 
 // ---------------------------------------------------------------------------
@@ -188,9 +192,9 @@ private:
 // ---------------------------------------------------------------------------
 inline void XPathMatcher::cleanUp() {
 
-    delete [] fMatched;
-    delete [] fNoMatchDepth;
-    delete [] fCurrentStep;
+    fMemoryManager->deallocate(fMatched);//delete [] fMatched;
+    fMemoryManager->deallocate(fNoMatchDepth);//delete [] fNoMatchDepth;
+    fMemoryManager->deallocate(fCurrentStep);//delete [] fCurrentStep;
     delete fStepIndexes;
 }
 
diff --git a/src/xercesc/validators/schema/identity/XPathMatcherStack.cpp b/src/xercesc/validators/schema/identity/XPathMatcherStack.cpp
index 2875f2aaf..8509f93a4 100644
--- a/src/xercesc/validators/schema/identity/XPathMatcherStack.cpp
+++ b/src/xercesc/validators/schema/identity/XPathMatcherStack.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.3  2003/05/15 18:59:34  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.2  2002/11/04 14:47:41  tng
  * C++ Namespace Support.
  *
@@ -77,13 +80,13 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 //  XPathMatherStack: Constructors and Destructor
 // ---------------------------------------------------------------------------
-XPathMatcherStack::XPathMatcherStack()
+XPathMatcherStack::XPathMatcherStack(MemoryManager* const manager)
     : fMatchersCount(0)
-    , fContextStack(new ValueStackOf<int>(8))
+    , fContextStack(new (manager) ValueStackOf<int>(8))
     , fMatchers(0)
 {
     try {
-        fMatchers = new RefVectorOf<XPathMatcher>(8);
+        fMatchers = new (manager) RefVectorOf<XPathMatcher>(8);
     }
     catch(...) {
 
diff --git a/src/xercesc/validators/schema/identity/XPathMatcherStack.hpp b/src/xercesc/validators/schema/identity/XPathMatcherStack.hpp
index 80088d353..3b5dc8b9b 100644
--- a/src/xercesc/validators/schema/identity/XPathMatcherStack.hpp
+++ b/src/xercesc/validators/schema/identity/XPathMatcherStack.hpp
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 2001 The Apache Software Foundation.  All rights
+ * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -69,13 +69,13 @@
 
 XERCES_CPP_NAMESPACE_BEGIN
 
-class VALIDATORS_EXPORT XPathMatcherStack
+class VALIDATORS_EXPORT XPathMatcherStack : public XMemory
 {
 public:
     // -----------------------------------------------------------------------
     //  Constructors/Destructor
     // -----------------------------------------------------------------------
-    XPathMatcherStack();
+    XPathMatcherStack(MemoryManager* const manager);
 	~XPathMatcherStack();
 
 	// -----------------------------------------------------------------------
diff --git a/src/xercesc/validators/schema/identity/XercesXPath.cpp b/src/xercesc/validators/schema/identity/XercesXPath.cpp
index a4658ccac..2bd07f698 100644
--- a/src/xercesc/validators/schema/identity/XercesXPath.cpp
+++ b/src/xercesc/validators/schema/identity/XercesXPath.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.6  2003/05/15 18:59:34  knoaman
+ * Partial implementation of the configurable memory manager.
+ *
  * Revision 1.5  2002/12/20 22:10:48  tng
  * XML 1.1
  *
@@ -270,10 +273,13 @@ XercesXPath::XercesXPath(const XMLCh* const xpathExpr,
                          const unsigned int emptyNamespaceId,
                          const bool isSelector)
     : fEmptyNamespaceId(emptyNamespaceId)
-    , fExpression(XMLString::replicate(xpathExpr))
+    , fExpression(0)
     , fLocationPaths(0)
+    , fMemoryManager(XMLPlatformUtils::fgMemoryManager)
 {
-    try {
+    try
+    {
+        fExpression = XMLString::replicate(xpathExpr, fMemoryManager);
         parseExpression(stringPool, scopeContext);
 
         if (isSelector) {
@@ -320,7 +326,7 @@ bool XercesXPath::operator!=(const XercesXPath& other) const {
 // ---------------------------------------------------------------------------
 void XercesXPath::cleanUp() {
 
-    delete [] fExpression;
+    fMemoryManager->deallocate(fExpression);//delete [] fExpression;
     delete fLocationPaths;
 }
 
@@ -356,11 +362,11 @@ void XercesXPath::parseExpression(XMLStringPool* const stringPool,
     bool                              success = scanner.scanExpression(fExpression, 0, length, &tokens);
     bool                              firstTokenOfLocationPath=true;
     unsigned int                      tokenCount = tokens.size();
-    RefVectorOf<XercesStep>*          stepsVector = new RefVectorOf<XercesStep>(16);
+    RefVectorOf<XercesStep>*          stepsVector = new (fMemoryManager) RefVectorOf<XercesStep>(16);
     Janitor<RefVectorOf<XercesStep> > janSteps(stepsVector);
 
     if (tokenCount) {
-        fLocationPaths = new RefVectorOf<XercesLocationPath>(8);
+        fLocationPaths = new (fMemoryManager) RefVectorOf<XercesLocationPath>(8);
     }
 
     for (unsigned int i = 0; i < tokenCount; i++) {
@@ -381,9 +387,9 @@ void XercesXPath::parseExpression(XMLStringPool* const stringPool,
                     ThrowXML(XPathException, XMLExcepts::XPath_NoMultipleUnion);
                 }
 
-                fLocationPaths->addElement(new XercesLocationPath(stepsVector));
+                fLocationPaths->addElement(new (fMemoryManager) XercesLocationPath(stepsVector));
                 janSteps.orphan();
-                stepsVector = new RefVectorOf<XercesStep>(16);
+                stepsVector = new (fMemoryManager) RefVectorOf<XercesStep>(16);
                 janSteps.reset(stepsVector);
                 firstTokenOfLocationPath = true;
             }
@@ -414,8 +420,8 @@ void XercesXPath::parseExpression(XMLStringPool* const stringPool,
 
                 case XercesXPath::EXPRTOKEN_NAMETEST_ANY:
                     {
-                        XercesNodeTest* nodeTest = new XercesNodeTest(XercesNodeTest::WILDCARD);
-                        XercesStep* step = new XercesStep(XercesStep::ATTRIBUTE, nodeTest);
+                        XercesNodeTest* nodeTest = new (fMemoryManager) XercesNodeTest(XercesNodeTest::WILDCARD);
+                        XercesStep* step = new (fMemoryManager) XercesStep(XercesStep::ATTRIBUTE, nodeTest);
                         stepsVector->addElement(step);
                         break;
                     }
@@ -443,8 +449,8 @@ void XercesXPath::parseExpression(XMLStringPool* const stringPool,
                         if (isNamespaceAtt) {
 
                             // build step
-                            XercesNodeTest* nodeTest = new XercesNodeTest(prefix, uri);
-                            XercesStep* step = new XercesStep(XercesStep::ATTRIBUTE, nodeTest);
+                            XercesNodeTest* nodeTest = new (fMemoryManager) XercesNodeTest(prefix, uri);
+                            XercesStep* step = new (fMemoryManager) XercesStep(XercesStep::ATTRIBUTE, nodeTest);
                             stepsVector->addElement(step);
                             break;
                         }
@@ -455,8 +461,8 @@ void XercesXPath::parseExpression(XMLStringPool* const stringPool,
                         QName aQName(prefix, localPart, uri);
 
                         // build step
-                        XercesNodeTest* nodeTest = new XercesNodeTest(&aQName);
-                        XercesStep* step = new XercesStep(XercesStep::ATTRIBUTE, nodeTest);
+                        XercesNodeTest* nodeTest = new (fMemoryManager) XercesNodeTest(&aQName);
+                        XercesStep* step = new (fMemoryManager) XercesStep(XercesStep::ATTRIBUTE, nodeTest);
                         stepsVector->addElement(step);
                         break;
                     }
@@ -484,8 +490,8 @@ void XercesXPath::parseExpression(XMLStringPool* const stringPool,
             }
         case XercesXPath::EXPRTOKEN_NAMETEST_ANY:
             {
-                XercesNodeTest* nodeTest = new XercesNodeTest(XercesNodeTest::WILDCARD);
-                XercesStep* step = new XercesStep(XercesStep::CHILD, nodeTest);
+                XercesNodeTest* nodeTest = new (fMemoryManager) XercesNodeTest(XercesNodeTest::WILDCARD);
+                XercesStep* step = new (fMemoryManager) XercesStep(XercesStep::CHILD, nodeTest);
                 stepsVector->addElement(step);
                 firstTokenOfLocationPath = false;
                 break;
@@ -515,8 +521,8 @@ void XercesXPath::parseExpression(XMLStringPool* const stringPool,
                 if (isNamespace) {
 
                     // build step
-                    XercesNodeTest* nodeTest = new XercesNodeTest(prefix, uri);
-                    XercesStep* step = new XercesStep(XercesStep::CHILD, nodeTest);
+                    XercesNodeTest* nodeTest = new (fMemoryManager) XercesNodeTest(prefix, uri);
+                    XercesStep* step = new (fMemoryManager) XercesStep(XercesStep::CHILD, nodeTest);
                     stepsVector->addElement(step);
                     break;
                 }
@@ -526,8 +532,8 @@ void XercesXPath::parseExpression(XMLStringPool* const stringPool,
                 QName aQName(prefix, localPart, uri);
 
                 // build step
-                XercesNodeTest* nodeTest = new XercesNodeTest(&aQName);
-                XercesStep* step = new XercesStep(XercesStep::CHILD, nodeTest);
+                XercesNodeTest* nodeTest = new (fMemoryManager) XercesNodeTest(&aQName);
+                XercesStep* step = new (fMemoryManager) XercesStep(XercesStep::CHILD, nodeTest);
                 stepsVector->addElement(step);
                 firstTokenOfLocationPath = false;
                 break;
@@ -535,8 +541,8 @@ void XercesXPath::parseExpression(XMLStringPool* const stringPool,
         case XercesXPath::EXPRTOKEN_PERIOD:
             {
                 // build step
-                XercesNodeTest* nodeTest = new XercesNodeTest(XercesNodeTest::NODE);
-                XercesStep* step = new XercesStep(XercesStep::SELF, nodeTest);
+                XercesNodeTest* nodeTest = new (fMemoryManager) XercesNodeTest(XercesNodeTest::NODE);
+                XercesStep* step = new (fMemoryManager) XercesStep(XercesStep::SELF, nodeTest);
                 stepsVector->addElement(step);
 
                 if (firstTokenOfLocationPath && i+1 < tokenCount) {
@@ -558,8 +564,8 @@ void XercesXPath::parseExpression(XMLStringPool* const stringPool,
                             }
                         }
                         // build step
-                        nodeTest = new XercesNodeTest(XercesNodeTest::NODE);
-                        step = new XercesStep(XercesStep::DESCENDANT, nodeTest);
+                        nodeTest = new (fMemoryManager) XercesNodeTest(XercesNodeTest::NODE);
+                        step = new (fMemoryManager) XercesStep(XercesStep::DESCENDANT, nodeTest);
                         stepsVector->addElement(step);
                     }
                 }
@@ -604,7 +610,7 @@ void XercesXPath::parseExpression(XMLStringPool* const stringPool,
         }
     }
 
-    fLocationPaths->addElement(new XercesLocationPath(stepsVector));
+    fLocationPaths->addElement(new (fMemoryManager) XercesLocationPath(stepsVector));
     janSteps.orphan();
 }
 
diff --git a/src/xercesc/validators/schema/identity/XercesXPath.hpp b/src/xercesc/validators/schema/identity/XercesXPath.hpp
index fb711f54a..8210212eb 100644
--- a/src/xercesc/validators/schema/identity/XercesXPath.hpp
+++ b/src/xercesc/validators/schema/identity/XercesXPath.hpp
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 2001 The Apache Software Foundation.  All rights
+ * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -78,7 +78,7 @@ class XMLStringPool;
 class NamespaceScope;
 
 
-class VALIDATORS_EXPORT XercesNodeTest
+class VALIDATORS_EXPORT XercesNodeTest : public XMemory
 {
 public:
     // -----------------------------------------------------------------------
@@ -125,7 +125,8 @@ private:
 /**
   * A location path step comprised of an axis and node test.
   */
-class VALIDATORS_EXPORT XercesStep {
+class VALIDATORS_EXPORT XercesStep : public XMemory
+{
 public:
     // -----------------------------------------------------------------------
     //  Constants
@@ -169,7 +170,7 @@ private:
 /**
   * A location path representation for an XPath expression.
   */
-class VALIDATORS_EXPORT XercesLocationPath
+class VALIDATORS_EXPORT XercesLocationPath : public XMemory
 {
 public:
     // -----------------------------------------------------------------------
@@ -206,7 +207,7 @@ private:
 };
 
 
-class VALIDATORS_EXPORT XercesXPath
+class VALIDATORS_EXPORT XercesXPath : public XMemory
 {
 public:
     // -----------------------------------------------------------------------
@@ -311,10 +312,11 @@ private:
     unsigned int                     fEmptyNamespaceId;
     XMLCh*                           fExpression;
     RefVectorOf<XercesLocationPath>* fLocationPaths;
+    MemoryManager*                   fMemoryManager;
 };
 
 
-class VALIDATORS_EXPORT XPathScanner
+class VALIDATORS_EXPORT XPathScanner : public XMemory
 {
 public:
     // -----------------------------------------------------------------------
-- 
GitLab