diff --git a/mozilla/htmlparser/src/nsExpatDTD.cpp b/mozilla/htmlparser/src/nsExpatDTD.cpp
new file mode 100644
index 00000000000..a45059d0bdf
--- /dev/null
+++ b/mozilla/htmlparser/src/nsExpatDTD.cpp
@@ -0,0 +1,470 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * The contents of this file are subject to the Netscape Public License
+ * Version 1.0 (the "NPL"); you may not use this file except in
+ * compliance with the NPL. You may obtain a copy of the NPL at
+ * http://www.mozilla.org/NPL/
+ *
+ * Software distributed under the NPL is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
+ * for the specific language governing rights and limitations under the
+ * NPL.
+ *
+ * The Initial Developer of this code under the NPL is Netscape
+ * Communications Corporation. Portions created by Netscape are
+ * Copyright (C) 1998 Netscape Communications Corporation. All Rights
+ * Reserved.
+ */
+
+/**
+ * MODULE NOTES:
+ * @update gess 4/8/98
+ *
+ *
+ */
+
+
+#include "nsIDTDDebug.h"
+#include "nsExpatDTD.h"
+#include "nsCRT.h"
+#include "nsParser.h"
+#include "nsScanner.h"
+#include "nsIParser.h"
+#include "nsTokenHandler.h"
+#include "nsDTDUtils.h"
+#include "nsIContentSink.h"
+#include "nsIHTMLContentSink.h"
+#include "nsExpatTokenizer.h"
+
+#include "prenv.h" //this is here for debug reasons...
+#include "prtypes.h" //this is here for debug reasons...
+#include "prio.h"
+#include "plstr.h"
+
+#ifdef XP_PC
+#include //this is here for debug reasons...
+#endif
+#include "prmem.h"
+
+
+static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
+static NS_DEFINE_IID(kIDTDIID, NS_IDTD_IID);
+static NS_DEFINE_IID(kClassIID, NS_EXPAT_DTD_IID);
+
+static const char* kViewSourceCommand= "view-source";
+
+
+static CTokenRecycler gTokenRecycler;
+
+
+/**
+ * This method gets called as part of our COM-like interfaces.
+ * Its purpose is to create an interface to parser object
+ * of some type.
+ *
+ * @update gess 4/8/98
+ * @param nsIID id of object to discover
+ * @param aInstancePtr ptr to newly discovered interface
+ * @return NS_xxx result code
+ */
+nsresult nsExpatDTD::QueryInterface(const nsIID& aIID, void** aInstancePtr)
+{
+ if (NULL == aInstancePtr) {
+ return NS_ERROR_NULL_POINTER;
+ }
+
+ if(aIID.Equals(kISupportsIID)) { //do IUnknown...
+ *aInstancePtr = (nsIDTD*)(this);
+ }
+ else if(aIID.Equals(kIDTDIID)) { //do IParser base class...
+ *aInstancePtr = (nsIDTD*)(this);
+ }
+ else if(aIID.Equals(kClassIID)) { //do this class...
+ *aInstancePtr = (nsExpatDTD*)(this);
+ }
+ else {
+ *aInstancePtr=0;
+ return NS_NOINTERFACE;
+ }
+ NS_ADDREF_THIS();
+ return NS_OK;
+}
+
+/**
+ * This method is defined in nsIParser. It is used to
+ * cause the COM-like construction of an nsParser.
+ *
+ * @update gess 4/8/98
+ * @param nsIParser** ptr to newly instantiated parser
+ * @return NS_xxx error result
+ */
+NS_HTMLPARS nsresult NS_New_Expat_DTD(nsIDTD** aInstancePtrResult) {
+ nsExpatDTD* it = new nsExpatDTD();
+ if (it == 0) {
+ return NS_ERROR_OUT_OF_MEMORY;
+ }
+ return it->QueryInterface(kClassIID, (void **) aInstancePtrResult);
+}
+
+
+NS_IMPL_ADDREF(nsExpatDTD)
+NS_IMPL_RELEASE(nsExpatDTD)
+
+
+/**
+ * Default constructor
+ *
+ * @update gess 4/9/98
+ * @param
+ * @return
+ */
+nsExpatDTD::nsExpatDTD() : nsIDTD() {
+ NS_INIT_REFCNT();
+ mParser=0;
+ mSink=0;
+ mFilename;
+ mLineNumber=0;
+ mTokenizer=0;
+}
+
+/**
+ * Default destructor
+ *
+ * @update gess 4/9/98
+ * @param
+ * @return
+ */
+nsExpatDTD::~nsExpatDTD(){
+ mParser=0; //just to prove we destructed...
+ if(mTokenizer)
+ delete (nsExpatTokenizer*)mTokenizer;
+}
+
+/**
+ *
+ * @update gess1/8/99
+ * @param
+ * @return
+ */
+const nsIID& nsExpatDTD::GetMostDerivedIID(void) const{
+ return kClassIID;
+}
+
+/**
+ * Call this method if you want the DTD to construct a fresh
+ * instance of itself.
+ * @update gess7/23/98
+ * @param
+ * @return
+ */
+nsresult nsExpatDTD::CreateNewInstance(nsIDTD** aInstancePtrResult){
+ return NS_New_Expat_DTD(aInstancePtrResult);
+}
+
+/**
+ * This method is called to determine if the given DTD can parse
+ * a document in a given source-type.
+ * NOTE: Parsing always assumes that the end result will involve
+ * storing the result in the main content model.
+ * @update gess6/24/98
+ * @param
+ * @return TRUE if this DTD can satisfy the request; FALSE otherwise.
+ */
+eAutoDetectResult nsExpatDTD::CanParse(nsString& aContentType, nsString& aCommand, nsString& aBuffer, PRInt32 aVersion) {
+ eAutoDetectResult result=eUnknownDetect;
+
+ if(!aCommand.Equals(kViewSourceCommand)) {
+ if(aContentType.Equals(kXMLTextContentType) ||
+ aContentType.Equals(kRDFTextContentType) ||
+ aContentType.Equals(kXULTextContentType)) {
+ result=eValidDetect;
+ }
+ else {
+ if(-1GetContentSink();
+ if((aNotifySink) && (mSink)) {
+ mLineNumber=0;
+ result = mSink->WillBuildModel();
+ }
+ }
+
+ return result;
+}
+
+/**
+ * The parser uses a code sandwich to wrap the parsing process. Before
+ * the process begins, WillBuildModel() is called. Afterwards the parser
+ * calls DidBuildModel().
+ * @update gess 1/4/99
+ * @param aFilename is the name of the file being parsed.
+ * @return error code (almost always 0)
+ */
+NS_IMETHODIMP nsExpatDTD::BuildModel(nsIParser* aParser,nsITokenizer* aTokenizer,nsITokenObserver* anObserver,nsIContentSink* aSink) {
+ nsresult result=NS_OK;
+
+ if(aTokenizer) {
+ nsITokenizer* oldTokenizer=mTokenizer;
+ mTokenizer=aTokenizer;
+ nsITokenRecycler* theRecycler=aTokenizer->GetTokenRecycler();
+
+ while(NS_OK==result){
+ CToken* theToken=mTokenizer->PopToken();
+ if(theToken) {
+ result=HandleToken(theToken,aParser);
+ if(NS_SUCCEEDED(result)) {
+ theRecycler->RecycleToken(theToken);
+ }
+ else if(NS_ERROR_HTMLPARSER_BLOCK!=result){
+ mTokenizer->PushTokenFront(theToken);
+ }
+ // theRootDTD->Verify(kEmptyString,aParser);
+ }
+ else break;
+ }//while
+ mTokenizer=oldTokenizer;
+ }
+ else result=NS_ERROR_HTMLPARSER_BADTOKENIZER;
+ return result;
+}
+
+
+/**
+ *
+ * @update gess5/18/98
+ * @param
+ * @return
+ */
+NS_IMETHODIMP nsExpatDTD::DidBuildModel(nsresult anErrorCode,PRBool aNotifySink,nsIParser* aParser,nsIContentSink* aSink){
+ nsresult result= NS_OK;
+
+ //ADD CODE HERE TO CLOSE OPEN CONTAINERS...
+
+ if(aParser){
+ mSink=aParser->GetContentSink();
+ if((aNotifySink) && (mSink)) {
+ result = mSink->DidBuildModel(1);
+ }
+ }
+ return result;
+}
+
+/**
+ *
+ * @update gess8/4/98
+ * @param
+ * @return
+ */
+nsITokenRecycler* nsExpatDTD::GetTokenRecycler(void){
+ nsITokenizer* theTokenizer=GetTokenizer();
+ return theTokenizer->GetTokenRecycler();
+}
+
+/**
+ * Retrieve the preferred tokenizer for use by this DTD.
+ * @update gess12/28/98
+ * @param none
+ * @return ptr to tokenizer
+ */
+nsITokenizer* nsExpatDTD::GetTokenizer(void) {
+ if(!mTokenizer)
+ mTokenizer=new nsExpatTokenizer();
+ return mTokenizer;
+}
+
+/**
+ *
+ * @update gess5/18/98
+ * @param
+ * @return
+ */
+NS_IMETHODIMP nsExpatDTD::WillResumeParse(void){
+ nsresult result = NS_OK;
+ if(mSink) {
+ result = mSink->WillResume();
+ }
+ return result;
+}
+
+/**
+ *
+ * @update gess5/18/98
+ * @param
+ * @return
+ */
+NS_IMETHODIMP nsExpatDTD::WillInterruptParse(void){
+ nsresult result = NS_OK;
+ if(mSink) {
+ result = mSink->WillInterrupt();
+ }
+ return result;
+}
+
+/**
+ * Called by the parser to initiate dtd verification of the
+ * internal context stack.
+ * @update gess 7/23/98
+ * @param
+ * @return
+ */
+PRBool nsExpatDTD::Verify(nsString& aURLRef,nsIParser* aParser) {
+ PRBool result=PR_TRUE;
+ mParser=(nsParser*)aParser;
+ return result;
+}
+
+/**
+ * Called by the parser to enable/disable dtd verification of the
+ * internal context stack.
+ * @update gess 7/23/98
+ * @param
+ * @return
+ */
+void nsExpatDTD::SetVerification(PRBool aEnabled){
+}
+
+/**
+ * This method is called to determine whether or not a tag
+ * of one type can contain a tag of another type.
+ *
+ * @update gess 3/25/98
+ * @param aParent -- int tag of parent container
+ * @param aChild -- int tag of child container
+ * @return PR_TRUE if parent can contain child
+ */
+PRBool nsExpatDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const{
+ PRBool result=PR_TRUE;
+ return result;
+}
+
+/**
+ * This method gets called to determine whether a given
+ * tag is itself a container
+ *
+ * @update gess 3/25/98
+ * @param aTag -- tag to test for containership
+ * @return PR_TRUE if given tag can contain other tags
+ */
+PRBool nsExpatDTD::IsContainer(PRInt32 aTag) const{
+ PRBool result=PR_TRUE;
+ return result;
+}
+
+/**
+ *
+ * @update vidur 11/12/98
+ * @param aToken -- token object to be put into content model
+ * @return 0 if all is well; non-zero is an error
+ */
+NS_IMETHODIMP nsExpatDTD::HandleToken(CToken* aToken,nsIParser* aParser) {
+ nsresult result=NS_OK;
+ CHTMLToken* theToken= (CHTMLToken*)(aToken);
+ eHTMLTokenTypes theType= (eHTMLTokenTypes)theToken->GetTokenType();
+
+ mParser=(nsParser*)aParser;
+ mSink=aParser->GetContentSink();
+
+ nsCParserNode theNode(theToken,mLineNumber);
+ switch(theType) {
+
+ case eToken_newline:
+ mLineNumber++; //now fall through
+ case eToken_entity:
+ case eToken_whitespace:
+ case eToken_text:
+ case eToken_cdatasection:
+ result=mSink->AddLeaf(theNode);
+ break;
+
+ case eToken_comment:
+ result=mSink->AddComment(theNode);
+ break;
+
+ case eToken_instruction:
+ result=mSink->AddProcessingInstruction(theNode);
+ break;
+
+ case eToken_start:
+ {
+ PRInt16 attrCount=aToken->GetAttributeCount();
+
+ if(0PeekToken();
+ if(theToken) {
+ eHTMLTokenTypes theType=eHTMLTokenTypes(theToken->GetTokenType());
+ if(eToken_attribute==theType){
+ mTokenizer->PopToken(); //pop it for real...
+ theNode.AddAttribute(theToken);
+ }
+ }
+ else return kEOF;
+ }
+ }
+ if(NS_OK==result){
+ result=mSink->OpenContainer(theNode);
+ if(((CStartToken*)aToken)->IsEmpty()){
+ result=mSink->CloseContainer(theNode);
+ }
+ }
+ }
+ break;
+
+ case eToken_end:
+ result=mSink->CloseContainer(theNode);
+ break;
+
+ case eToken_style:
+ case eToken_skippedcontent:
+ default:
+ result=NS_OK;
+ }//switch
+ return result;
+}
+
+
+/**
+ * This method causes all tokens to be dispatched to the given tag handler.
+ *
+ * @update gess 3/25/98
+ * @param aHandler -- object to receive subsequent tokens...
+ * @return error code (usually 0)
+ */
+nsresult nsExpatDTD::CaptureTokenPump(nsITagHandler* aHandler) {
+ nsresult result=NS_OK;
+ return result;
+}
+
+/**
+ * This method releases the token-pump capture obtained in CaptureTokenPump()
+ *
+ * @update gess 3/25/98
+ * @param aHandler -- object that received tokens...
+ * @return error code (usually 0)
+ */
+nsresult nsExpatDTD::ReleaseTokenPump(nsITagHandler* aHandler){
+ nsresult result=NS_OK;
+ return result;
+}
diff --git a/mozilla/htmlparser/src/nsExpatDTD.h b/mozilla/htmlparser/src/nsExpatDTD.h
new file mode 100644
index 00000000000..b6e7dc91033
--- /dev/null
+++ b/mozilla/htmlparser/src/nsExpatDTD.h
@@ -0,0 +1,238 @@
+
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * The contents of this file are subject to the Netscape Public License
+ * Version 1.0 (the "NPL"); you may not use this file except in
+ * compliance with the NPL. You may obtain a copy of the NPL at
+ * http://www.mozilla.org/NPL/
+ *
+ * Software distributed under the NPL is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
+ * for the specific language governing rights and limitations under the
+ * NPL.
+ *
+ * The Initial Developer of this code under the NPL is Netscape
+ * Communications Corporation. Portions created by Netscape are
+ * Copyright (C) 1998 Netscape Communications Corporation. All Rights
+ * Reserved.
+ */
+
+/**
+ * MODULE NOTES:
+ * @update gess 4/8/98
+ *
+ *
+ */
+
+#ifndef __NS_EXPAT_DTD
+#define __NS_EXPAT_DTD
+
+#include "nsIDTD.h"
+#include "nsISupports.h"
+#include "nsHTMLTokens.h"
+#include "nshtmlpars.h"
+#include "nsVoidArray.h"
+#include "nsDeque.h"
+#include "nsIContentSink.h"
+
+
+#define NS_EXPAT_DTD_IID \
+ {0x5ad4b431, 0xcabb, 0x11d2, \
+ {0xab, 0xcb, 0x0, 0x10, 0x4b, 0x98, 0x3f, 0xd4}}
+
+
+class nsIDTDDebug;
+class nsIParserNode;
+class CITokenHandler;
+class nsParser;
+
+
+
+class nsExpatDTD : public nsIDTD {
+
+ public:
+
+ NS_DECL_ISUPPORTS
+
+
+ /**
+ *
+ *
+ * @update gess 4/9/98
+ * @param
+ * @return
+ */
+ nsExpatDTD();
+
+ /**
+ *
+ *
+ * @update gess 4/9/98
+ * @param
+ * @return
+ */
+ virtual ~nsExpatDTD();
+
+ virtual const nsIID& GetMostDerivedIID(void) const;
+
+ /**
+ * Call this method if you want the DTD to construct a clone of itself.
+ * @update gess7/23/98
+ * @param
+ * @return
+ */
+ virtual nsresult CreateNewInstance(nsIDTD** aInstancePtrResult);
+
+ /**
+ * This method is called to determine if the given DTD can parse
+ * a document in a given source-type.
+ * NOTE: Parsing always assumes that the end result will involve
+ * storing the result in the main content model.
+ * @update gess6/24/98
+ * @param
+ * @return TRUE if this DTD can satisfy the request; FALSE otherwise.
+ */
+ virtual eAutoDetectResult CanParse(nsString& aContentType, nsString& aCommand, nsString& aBuffer, PRInt32 aVersion);
+
+ /**
+ * The parser uses a code sandwich to wrap the parsing process. Before
+ * the process begins, WillBuildModel() is called. Afterwards the parser
+ * calls DidBuildModel().
+ * @update gess5/18/98
+ * @param aFilename is the name of the file being parsed.
+ * @return error code (almost always 0)
+ */
+ NS_IMETHOD WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsIParser* aParser,nsIContentSink* aSink=0);
+
+ /**
+ * The parser uses a code sandwich to wrap the parsing process. Before
+ * the process begins, WillBuildModel() is called. Afterwards the parser
+ * calls DidBuildModel().
+ * @update gess5/18/98
+ * @param aFilename is the name of the file being parsed.
+ * @return error code (almost always 0)
+ */
+ NS_IMETHOD BuildModel(nsIParser* aParser,nsITokenizer* aTokenizer,nsITokenObserver* anObserver=0,nsIContentSink* aSink=0);
+
+ /**
+ * The parser uses a code sandwich to wrap the parsing process. Before
+ * the process begins, WillBuildModel() is called. Afterwards the parser
+ * calls DidBuildModel().
+ * @update gess5/18/98
+ * @param anErrorCode contans the last error that occured
+ * @return error code
+ */
+ NS_IMETHOD DidBuildModel(nsresult anErrorCode,PRBool aNotifySink,nsIParser* aParser,nsIContentSink* aSink=0);
+
+ /**
+ *
+ * @update gess 3/25/98
+ * @param aToken -- token object to be put into content model
+ * @return 0 if all is well; non-zero is an error
+ */
+ NS_IMETHOD HandleToken(CToken* aToken,nsIParser* aParser);
+
+ /**
+ * This method causes all tokens to be dispatched to the given tag handler.
+ *
+ * @update gess 3/25/98
+ * @param aHandler -- object to receive subsequent tokens...
+ * @return error code (usually 0)
+ */
+ NS_IMETHOD CaptureTokenPump(nsITagHandler* aHandler);
+
+ /**
+ * This method releases the token-pump capture obtained in CaptureTokenPump()
+ *
+ * @update gess 3/25/98
+ * @param aHandler -- object that received tokens...
+ * @return error code (usually 0)
+ */
+ NS_IMETHOD ReleaseTokenPump(nsITagHandler* aHandler);
+
+ /**
+ *
+ * @update gess12/28/98
+ * @param
+ * @return
+ */
+ nsITokenizer* GetTokenizer(void);
+
+ /**
+ *
+ * @update gess5/18/98
+ * @param
+ * @return
+ */
+ NS_IMETHOD WillResumeParse(void);
+
+ /**
+ *
+ * @update gess5/18/98
+ * @param
+ * @return
+ */
+ NS_IMETHOD WillInterruptParse(void);
+
+ /**
+ * Called by the parser to initiate dtd verification of the
+ * internal context stack.
+ * @update gess 7/23/98
+ * @param
+ * @return
+ */
+ virtual PRBool Verify(nsString& aURLRef,nsIParser* aParser);
+
+ /**
+ * Set this to TRUE if you want the DTD to verify its
+ * context stack.
+ * @update gess 7/23/98
+ * @param
+ * @return
+ */
+ virtual void SetVerification(PRBool aEnable);
+
+ /**
+ * This method is called to determine whether or not a tag
+ * of one type can contain a tag of another type.
+ *
+ * @update gess 3/25/98
+ * @param aParent -- int tag of parent container
+ * @param aChild -- int tag of child container
+ * @return PR_TRUE if parent can contain child
+ */
+ virtual PRBool CanContain(PRInt32 aParent,PRInt32 aChild) const;
+
+ /**
+ * This method gets called to determine whether a given
+ * tag is itself a container
+ *
+ * @update gess 3/25/98
+ * @param aTag -- tag to test for containership
+ * @return PR_TRUE if given tag can contain other tags
+ */
+ virtual PRBool IsContainer(PRInt32 aTag) const;
+
+ /**
+ * Retrieve a ptr to the global token recycler...
+ * @update gess8/4/98
+ * @return ptr to recycler (or null)
+ */
+ virtual nsITokenRecycler* GetTokenRecycler(void);
+
+protected:
+
+ nsParser* mParser;
+ nsIContentSink* mSink;
+ nsString mFilename;
+ PRInt32 mLineNumber;
+ nsITokenizer* mTokenizer;
+};
+
+extern NS_HTMLPARS nsresult NS_New_Expat_DTD(nsIDTD** aInstancePtrResult);
+
+
+#endif
+
+
+
diff --git a/mozilla/htmlparser/src/nsExpatTokenizer.cpp b/mozilla/htmlparser/src/nsExpatTokenizer.cpp
new file mode 100644
index 00000000000..d2fea3bea0b
--- /dev/null
+++ b/mozilla/htmlparser/src/nsExpatTokenizer.cpp
@@ -0,0 +1,141 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * The contents of this file are subject to the Netscape Public License
+ * Version 1.0 (the "NPL"); you may not use this file except in
+ * compliance with the NPL. You may obtain a copy of the NPL at
+ * http://www.mozilla.org/NPL/
+ *
+ * Software distributed under the NPL is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
+ * for the specific language governing rights and limitations under the
+ * NPL.
+ *
+ * The Initial Developer of this code under the NPL is Netscape
+ * Communications Corporation. Portions created by Netscape are
+ * Copyright (C) 1998 Netscape Communications Corporation. All Rights
+ * Reserved.
+ */
+
+
+/**
+ * MODULE NOTES:
+ * @update gess 4/1/98
+ *
+ */
+
+#include "nsExpatTokenizer.h"
+#include "nsParser.h"
+#include "nsScanner.h"
+#include "nsDTDUtils.h"
+#include "nsParser.h"
+
+/************************************************************************
+ And now for the main class -- nsExpatTokenizer...
+ ************************************************************************/
+
+static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
+static NS_DEFINE_IID(kITokenizerIID, NS_ITOKENIZER_IID);
+static NS_DEFINE_IID(kHTMLTokenizerIID, NS_HTMLTOKENIZER_IID);
+static NS_DEFINE_IID(kClassIID, NS_EXPATTOKENIZER_IID);
+static nsAutoString gEmpty;
+
+/**
+ * This method gets called as part of our COM-like interfaces.
+ * Its purpose is to create an interface to parser object
+ * of some type.
+ *
+ * @update gess 4/8/98
+ * @param nsIID id of object to discover
+ * @param aInstancePtr ptr to newly discovered interface
+ * @return NS_xxx result code
+ */
+nsresult nsExpatTokenizer::QueryInterface(const nsIID& aIID, void** aInstancePtr)
+{
+ if (NULL == aInstancePtr) {
+ return NS_ERROR_NULL_POINTER;
+ }
+
+ if(aIID.Equals(kISupportsIID)) { //do IUnknown...
+ *aInstancePtr = (nsExpatTokenizer*)(this);
+ }
+ else if(aIID.Equals(kITokenizerIID)) { //do ITOkenizer base class...
+ *aInstancePtr = (nsITokenizer*)(this);
+ }
+ else if(aIID.Equals(kHTMLTokenizerIID)) { //do nsHTMLTokenizer base class...
+ *aInstancePtr = (nsHTMLTokenizer*)(this);
+ }
+ else if(aIID.Equals(kClassIID)) { //do this class...
+ *aInstancePtr = (nsExpatTokenizer*)(this);
+ }
+ else {
+ *aInstancePtr=0;
+ return NS_NOINTERFACE;
+ }
+ NS_ADDREF_THIS();
+ return NS_OK;
+}
+
+
+/**
+ * This method is defined in nsIParser. It is used to
+ * cause the COM-like construction of an nsParser.
+ *
+ * @update gess 4/8/98
+ * @param nsIParser** ptr to newly instantiated parser
+ * @return NS_xxx error result
+ */
+NS_HTMLPARS nsresult NS_New_Expat_Tokenizer(nsIDTD** aInstancePtrResult) {
+ nsExpatTokenizer* it = new nsExpatTokenizer();
+ if (it == 0) {
+ return NS_ERROR_OUT_OF_MEMORY;
+ }
+ return it->QueryInterface(kClassIID, (void **) aInstancePtrResult);
+}
+
+
+NS_IMPL_ADDREF(nsExpatTokenizer)
+NS_IMPL_RELEASE(nsExpatTokenizer)
+
+
+/**
+ * Default constructor
+ *
+ * @update gess 4/9/98
+ * @param
+ * @return
+ */
+nsExpatTokenizer::nsExpatTokenizer() : nsHTMLTokenizer() {
+ NS_INIT_REFCNT();
+}
+
+/**
+ * Default constructor
+ *
+ * @update gess 4/9/98
+ * @param
+ * @return
+ */
+nsExpatTokenizer::~nsExpatTokenizer(){
+}
+
+
+/*******************************************************************
+ Here begins the real working methods for the tokenizer.
+ *******************************************************************/
+
+/**
+ * This method repeatedly called by the tokenizer.
+ * Each time, we determine the kind of token were about to
+ * read, and then we call the appropriate method to handle
+ * that token type.
+ *
+ * @update gess 3/25/98
+ * @param aChar: last char read
+ * @param aScanner: see nsScanner.h
+ * @param anErrorCode: arg that will hold error condition
+ * @return new token or null
+ */
+nsresult nsExpatTokenizer::ConsumeToken(nsScanner& aScanner) {
+ return nsHTMLTokenizer::ConsumeToken(aScanner);
+}
+
diff --git a/mozilla/htmlparser/src/nsExpatTokenizer.h b/mozilla/htmlparser/src/nsExpatTokenizer.h
new file mode 100644
index 00000000000..a98a4fa9210
--- /dev/null
+++ b/mozilla/htmlparser/src/nsExpatTokenizer.h
@@ -0,0 +1,59 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * The contents of this file are subject to the Netscape Public License
+ * Version 1.0 (the "NPL"); you may not use this file except in
+ * compliance with the NPL. You may obtain a copy of the NPL at
+ * http://www.mozilla.org/NPL/
+ *
+ * Software distributed under the NPL is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
+ * for the specific language governing rights and limitations under the
+ * NPL.
+ *
+ * The Initial Developer of this code under the NPL is Netscape
+ * Communications Corporation. Portions created by Netscape are
+ * Copyright (C) 1998 Netscape Communications Corporation. All Rights
+ * Reserved.
+ */
+
+
+/**
+ * MODULE NOTES:
+ * @update gess 4/1/98
+ *
+ */
+
+#ifndef __nsExpatTokenizer
+#define __nsExpatTokenizer
+
+#include "nsISupports.h"
+#include "nsHTMLTokenizer.h"
+#include "prtypes.h"
+
+#define NS_EXPATTOKENIZER_IID \
+ {0x483836aa, 0xcabe, 0x11d2, { 0xab, 0xcb, 0x0, 0x10, 0x4b, 0x98, 0x3f, 0xd4 }}
+
+
+/***************************************************************
+ Notes:
+ ***************************************************************/
+
+#if defined(XP_PC)
+#pragma warning( disable : 4275 )
+#endif
+
+CLASS_EXPORT_HTMLPARS nsExpatTokenizer : public nsHTMLTokenizer {
+public:
+ nsExpatTokenizer();
+ virtual ~nsExpatTokenizer();
+
+ NS_DECL_ISUPPORTS
+
+ virtual nsresult ConsumeToken(nsScanner& aScanner);
+};
+
+extern NS_HTMLPARS nsresult NS_Expat_Tokenizer(nsIDTD** aInstancePtrResult);
+
+#endif
+
+
diff --git a/mozilla/parser/htmlparser/src/nsExpatDTD.cpp b/mozilla/parser/htmlparser/src/nsExpatDTD.cpp
new file mode 100644
index 00000000000..a45059d0bdf
--- /dev/null
+++ b/mozilla/parser/htmlparser/src/nsExpatDTD.cpp
@@ -0,0 +1,470 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * The contents of this file are subject to the Netscape Public License
+ * Version 1.0 (the "NPL"); you may not use this file except in
+ * compliance with the NPL. You may obtain a copy of the NPL at
+ * http://www.mozilla.org/NPL/
+ *
+ * Software distributed under the NPL is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
+ * for the specific language governing rights and limitations under the
+ * NPL.
+ *
+ * The Initial Developer of this code under the NPL is Netscape
+ * Communications Corporation. Portions created by Netscape are
+ * Copyright (C) 1998 Netscape Communications Corporation. All Rights
+ * Reserved.
+ */
+
+/**
+ * MODULE NOTES:
+ * @update gess 4/8/98
+ *
+ *
+ */
+
+
+#include "nsIDTDDebug.h"
+#include "nsExpatDTD.h"
+#include "nsCRT.h"
+#include "nsParser.h"
+#include "nsScanner.h"
+#include "nsIParser.h"
+#include "nsTokenHandler.h"
+#include "nsDTDUtils.h"
+#include "nsIContentSink.h"
+#include "nsIHTMLContentSink.h"
+#include "nsExpatTokenizer.h"
+
+#include "prenv.h" //this is here for debug reasons...
+#include "prtypes.h" //this is here for debug reasons...
+#include "prio.h"
+#include "plstr.h"
+
+#ifdef XP_PC
+#include //this is here for debug reasons...
+#endif
+#include "prmem.h"
+
+
+static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
+static NS_DEFINE_IID(kIDTDIID, NS_IDTD_IID);
+static NS_DEFINE_IID(kClassIID, NS_EXPAT_DTD_IID);
+
+static const char* kViewSourceCommand= "view-source";
+
+
+static CTokenRecycler gTokenRecycler;
+
+
+/**
+ * This method gets called as part of our COM-like interfaces.
+ * Its purpose is to create an interface to parser object
+ * of some type.
+ *
+ * @update gess 4/8/98
+ * @param nsIID id of object to discover
+ * @param aInstancePtr ptr to newly discovered interface
+ * @return NS_xxx result code
+ */
+nsresult nsExpatDTD::QueryInterface(const nsIID& aIID, void** aInstancePtr)
+{
+ if (NULL == aInstancePtr) {
+ return NS_ERROR_NULL_POINTER;
+ }
+
+ if(aIID.Equals(kISupportsIID)) { //do IUnknown...
+ *aInstancePtr = (nsIDTD*)(this);
+ }
+ else if(aIID.Equals(kIDTDIID)) { //do IParser base class...
+ *aInstancePtr = (nsIDTD*)(this);
+ }
+ else if(aIID.Equals(kClassIID)) { //do this class...
+ *aInstancePtr = (nsExpatDTD*)(this);
+ }
+ else {
+ *aInstancePtr=0;
+ return NS_NOINTERFACE;
+ }
+ NS_ADDREF_THIS();
+ return NS_OK;
+}
+
+/**
+ * This method is defined in nsIParser. It is used to
+ * cause the COM-like construction of an nsParser.
+ *
+ * @update gess 4/8/98
+ * @param nsIParser** ptr to newly instantiated parser
+ * @return NS_xxx error result
+ */
+NS_HTMLPARS nsresult NS_New_Expat_DTD(nsIDTD** aInstancePtrResult) {
+ nsExpatDTD* it = new nsExpatDTD();
+ if (it == 0) {
+ return NS_ERROR_OUT_OF_MEMORY;
+ }
+ return it->QueryInterface(kClassIID, (void **) aInstancePtrResult);
+}
+
+
+NS_IMPL_ADDREF(nsExpatDTD)
+NS_IMPL_RELEASE(nsExpatDTD)
+
+
+/**
+ * Default constructor
+ *
+ * @update gess 4/9/98
+ * @param
+ * @return
+ */
+nsExpatDTD::nsExpatDTD() : nsIDTD() {
+ NS_INIT_REFCNT();
+ mParser=0;
+ mSink=0;
+ mFilename;
+ mLineNumber=0;
+ mTokenizer=0;
+}
+
+/**
+ * Default destructor
+ *
+ * @update gess 4/9/98
+ * @param
+ * @return
+ */
+nsExpatDTD::~nsExpatDTD(){
+ mParser=0; //just to prove we destructed...
+ if(mTokenizer)
+ delete (nsExpatTokenizer*)mTokenizer;
+}
+
+/**
+ *
+ * @update gess1/8/99
+ * @param
+ * @return
+ */
+const nsIID& nsExpatDTD::GetMostDerivedIID(void) const{
+ return kClassIID;
+}
+
+/**
+ * Call this method if you want the DTD to construct a fresh
+ * instance of itself.
+ * @update gess7/23/98
+ * @param
+ * @return
+ */
+nsresult nsExpatDTD::CreateNewInstance(nsIDTD** aInstancePtrResult){
+ return NS_New_Expat_DTD(aInstancePtrResult);
+}
+
+/**
+ * This method is called to determine if the given DTD can parse
+ * a document in a given source-type.
+ * NOTE: Parsing always assumes that the end result will involve
+ * storing the result in the main content model.
+ * @update gess6/24/98
+ * @param
+ * @return TRUE if this DTD can satisfy the request; FALSE otherwise.
+ */
+eAutoDetectResult nsExpatDTD::CanParse(nsString& aContentType, nsString& aCommand, nsString& aBuffer, PRInt32 aVersion) {
+ eAutoDetectResult result=eUnknownDetect;
+
+ if(!aCommand.Equals(kViewSourceCommand)) {
+ if(aContentType.Equals(kXMLTextContentType) ||
+ aContentType.Equals(kRDFTextContentType) ||
+ aContentType.Equals(kXULTextContentType)) {
+ result=eValidDetect;
+ }
+ else {
+ if(-1GetContentSink();
+ if((aNotifySink) && (mSink)) {
+ mLineNumber=0;
+ result = mSink->WillBuildModel();
+ }
+ }
+
+ return result;
+}
+
+/**
+ * The parser uses a code sandwich to wrap the parsing process. Before
+ * the process begins, WillBuildModel() is called. Afterwards the parser
+ * calls DidBuildModel().
+ * @update gess 1/4/99
+ * @param aFilename is the name of the file being parsed.
+ * @return error code (almost always 0)
+ */
+NS_IMETHODIMP nsExpatDTD::BuildModel(nsIParser* aParser,nsITokenizer* aTokenizer,nsITokenObserver* anObserver,nsIContentSink* aSink) {
+ nsresult result=NS_OK;
+
+ if(aTokenizer) {
+ nsITokenizer* oldTokenizer=mTokenizer;
+ mTokenizer=aTokenizer;
+ nsITokenRecycler* theRecycler=aTokenizer->GetTokenRecycler();
+
+ while(NS_OK==result){
+ CToken* theToken=mTokenizer->PopToken();
+ if(theToken) {
+ result=HandleToken(theToken,aParser);
+ if(NS_SUCCEEDED(result)) {
+ theRecycler->RecycleToken(theToken);
+ }
+ else if(NS_ERROR_HTMLPARSER_BLOCK!=result){
+ mTokenizer->PushTokenFront(theToken);
+ }
+ // theRootDTD->Verify(kEmptyString,aParser);
+ }
+ else break;
+ }//while
+ mTokenizer=oldTokenizer;
+ }
+ else result=NS_ERROR_HTMLPARSER_BADTOKENIZER;
+ return result;
+}
+
+
+/**
+ *
+ * @update gess5/18/98
+ * @param
+ * @return
+ */
+NS_IMETHODIMP nsExpatDTD::DidBuildModel(nsresult anErrorCode,PRBool aNotifySink,nsIParser* aParser,nsIContentSink* aSink){
+ nsresult result= NS_OK;
+
+ //ADD CODE HERE TO CLOSE OPEN CONTAINERS...
+
+ if(aParser){
+ mSink=aParser->GetContentSink();
+ if((aNotifySink) && (mSink)) {
+ result = mSink->DidBuildModel(1);
+ }
+ }
+ return result;
+}
+
+/**
+ *
+ * @update gess8/4/98
+ * @param
+ * @return
+ */
+nsITokenRecycler* nsExpatDTD::GetTokenRecycler(void){
+ nsITokenizer* theTokenizer=GetTokenizer();
+ return theTokenizer->GetTokenRecycler();
+}
+
+/**
+ * Retrieve the preferred tokenizer for use by this DTD.
+ * @update gess12/28/98
+ * @param none
+ * @return ptr to tokenizer
+ */
+nsITokenizer* nsExpatDTD::GetTokenizer(void) {
+ if(!mTokenizer)
+ mTokenizer=new nsExpatTokenizer();
+ return mTokenizer;
+}
+
+/**
+ *
+ * @update gess5/18/98
+ * @param
+ * @return
+ */
+NS_IMETHODIMP nsExpatDTD::WillResumeParse(void){
+ nsresult result = NS_OK;
+ if(mSink) {
+ result = mSink->WillResume();
+ }
+ return result;
+}
+
+/**
+ *
+ * @update gess5/18/98
+ * @param
+ * @return
+ */
+NS_IMETHODIMP nsExpatDTD::WillInterruptParse(void){
+ nsresult result = NS_OK;
+ if(mSink) {
+ result = mSink->WillInterrupt();
+ }
+ return result;
+}
+
+/**
+ * Called by the parser to initiate dtd verification of the
+ * internal context stack.
+ * @update gess 7/23/98
+ * @param
+ * @return
+ */
+PRBool nsExpatDTD::Verify(nsString& aURLRef,nsIParser* aParser) {
+ PRBool result=PR_TRUE;
+ mParser=(nsParser*)aParser;
+ return result;
+}
+
+/**
+ * Called by the parser to enable/disable dtd verification of the
+ * internal context stack.
+ * @update gess 7/23/98
+ * @param
+ * @return
+ */
+void nsExpatDTD::SetVerification(PRBool aEnabled){
+}
+
+/**
+ * This method is called to determine whether or not a tag
+ * of one type can contain a tag of another type.
+ *
+ * @update gess 3/25/98
+ * @param aParent -- int tag of parent container
+ * @param aChild -- int tag of child container
+ * @return PR_TRUE if parent can contain child
+ */
+PRBool nsExpatDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const{
+ PRBool result=PR_TRUE;
+ return result;
+}
+
+/**
+ * This method gets called to determine whether a given
+ * tag is itself a container
+ *
+ * @update gess 3/25/98
+ * @param aTag -- tag to test for containership
+ * @return PR_TRUE if given tag can contain other tags
+ */
+PRBool nsExpatDTD::IsContainer(PRInt32 aTag) const{
+ PRBool result=PR_TRUE;
+ return result;
+}
+
+/**
+ *
+ * @update vidur 11/12/98
+ * @param aToken -- token object to be put into content model
+ * @return 0 if all is well; non-zero is an error
+ */
+NS_IMETHODIMP nsExpatDTD::HandleToken(CToken* aToken,nsIParser* aParser) {
+ nsresult result=NS_OK;
+ CHTMLToken* theToken= (CHTMLToken*)(aToken);
+ eHTMLTokenTypes theType= (eHTMLTokenTypes)theToken->GetTokenType();
+
+ mParser=(nsParser*)aParser;
+ mSink=aParser->GetContentSink();
+
+ nsCParserNode theNode(theToken,mLineNumber);
+ switch(theType) {
+
+ case eToken_newline:
+ mLineNumber++; //now fall through
+ case eToken_entity:
+ case eToken_whitespace:
+ case eToken_text:
+ case eToken_cdatasection:
+ result=mSink->AddLeaf(theNode);
+ break;
+
+ case eToken_comment:
+ result=mSink->AddComment(theNode);
+ break;
+
+ case eToken_instruction:
+ result=mSink->AddProcessingInstruction(theNode);
+ break;
+
+ case eToken_start:
+ {
+ PRInt16 attrCount=aToken->GetAttributeCount();
+
+ if(0PeekToken();
+ if(theToken) {
+ eHTMLTokenTypes theType=eHTMLTokenTypes(theToken->GetTokenType());
+ if(eToken_attribute==theType){
+ mTokenizer->PopToken(); //pop it for real...
+ theNode.AddAttribute(theToken);
+ }
+ }
+ else return kEOF;
+ }
+ }
+ if(NS_OK==result){
+ result=mSink->OpenContainer(theNode);
+ if(((CStartToken*)aToken)->IsEmpty()){
+ result=mSink->CloseContainer(theNode);
+ }
+ }
+ }
+ break;
+
+ case eToken_end:
+ result=mSink->CloseContainer(theNode);
+ break;
+
+ case eToken_style:
+ case eToken_skippedcontent:
+ default:
+ result=NS_OK;
+ }//switch
+ return result;
+}
+
+
+/**
+ * This method causes all tokens to be dispatched to the given tag handler.
+ *
+ * @update gess 3/25/98
+ * @param aHandler -- object to receive subsequent tokens...
+ * @return error code (usually 0)
+ */
+nsresult nsExpatDTD::CaptureTokenPump(nsITagHandler* aHandler) {
+ nsresult result=NS_OK;
+ return result;
+}
+
+/**
+ * This method releases the token-pump capture obtained in CaptureTokenPump()
+ *
+ * @update gess 3/25/98
+ * @param aHandler -- object that received tokens...
+ * @return error code (usually 0)
+ */
+nsresult nsExpatDTD::ReleaseTokenPump(nsITagHandler* aHandler){
+ nsresult result=NS_OK;
+ return result;
+}
diff --git a/mozilla/parser/htmlparser/src/nsExpatDTD.h b/mozilla/parser/htmlparser/src/nsExpatDTD.h
new file mode 100644
index 00000000000..b6e7dc91033
--- /dev/null
+++ b/mozilla/parser/htmlparser/src/nsExpatDTD.h
@@ -0,0 +1,238 @@
+
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * The contents of this file are subject to the Netscape Public License
+ * Version 1.0 (the "NPL"); you may not use this file except in
+ * compliance with the NPL. You may obtain a copy of the NPL at
+ * http://www.mozilla.org/NPL/
+ *
+ * Software distributed under the NPL is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
+ * for the specific language governing rights and limitations under the
+ * NPL.
+ *
+ * The Initial Developer of this code under the NPL is Netscape
+ * Communications Corporation. Portions created by Netscape are
+ * Copyright (C) 1998 Netscape Communications Corporation. All Rights
+ * Reserved.
+ */
+
+/**
+ * MODULE NOTES:
+ * @update gess 4/8/98
+ *
+ *
+ */
+
+#ifndef __NS_EXPAT_DTD
+#define __NS_EXPAT_DTD
+
+#include "nsIDTD.h"
+#include "nsISupports.h"
+#include "nsHTMLTokens.h"
+#include "nshtmlpars.h"
+#include "nsVoidArray.h"
+#include "nsDeque.h"
+#include "nsIContentSink.h"
+
+
+#define NS_EXPAT_DTD_IID \
+ {0x5ad4b431, 0xcabb, 0x11d2, \
+ {0xab, 0xcb, 0x0, 0x10, 0x4b, 0x98, 0x3f, 0xd4}}
+
+
+class nsIDTDDebug;
+class nsIParserNode;
+class CITokenHandler;
+class nsParser;
+
+
+
+class nsExpatDTD : public nsIDTD {
+
+ public:
+
+ NS_DECL_ISUPPORTS
+
+
+ /**
+ *
+ *
+ * @update gess 4/9/98
+ * @param
+ * @return
+ */
+ nsExpatDTD();
+
+ /**
+ *
+ *
+ * @update gess 4/9/98
+ * @param
+ * @return
+ */
+ virtual ~nsExpatDTD();
+
+ virtual const nsIID& GetMostDerivedIID(void) const;
+
+ /**
+ * Call this method if you want the DTD to construct a clone of itself.
+ * @update gess7/23/98
+ * @param
+ * @return
+ */
+ virtual nsresult CreateNewInstance(nsIDTD** aInstancePtrResult);
+
+ /**
+ * This method is called to determine if the given DTD can parse
+ * a document in a given source-type.
+ * NOTE: Parsing always assumes that the end result will involve
+ * storing the result in the main content model.
+ * @update gess6/24/98
+ * @param
+ * @return TRUE if this DTD can satisfy the request; FALSE otherwise.
+ */
+ virtual eAutoDetectResult CanParse(nsString& aContentType, nsString& aCommand, nsString& aBuffer, PRInt32 aVersion);
+
+ /**
+ * The parser uses a code sandwich to wrap the parsing process. Before
+ * the process begins, WillBuildModel() is called. Afterwards the parser
+ * calls DidBuildModel().
+ * @update gess5/18/98
+ * @param aFilename is the name of the file being parsed.
+ * @return error code (almost always 0)
+ */
+ NS_IMETHOD WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsIParser* aParser,nsIContentSink* aSink=0);
+
+ /**
+ * The parser uses a code sandwich to wrap the parsing process. Before
+ * the process begins, WillBuildModel() is called. Afterwards the parser
+ * calls DidBuildModel().
+ * @update gess5/18/98
+ * @param aFilename is the name of the file being parsed.
+ * @return error code (almost always 0)
+ */
+ NS_IMETHOD BuildModel(nsIParser* aParser,nsITokenizer* aTokenizer,nsITokenObserver* anObserver=0,nsIContentSink* aSink=0);
+
+ /**
+ * The parser uses a code sandwich to wrap the parsing process. Before
+ * the process begins, WillBuildModel() is called. Afterwards the parser
+ * calls DidBuildModel().
+ * @update gess5/18/98
+ * @param anErrorCode contans the last error that occured
+ * @return error code
+ */
+ NS_IMETHOD DidBuildModel(nsresult anErrorCode,PRBool aNotifySink,nsIParser* aParser,nsIContentSink* aSink=0);
+
+ /**
+ *
+ * @update gess 3/25/98
+ * @param aToken -- token object to be put into content model
+ * @return 0 if all is well; non-zero is an error
+ */
+ NS_IMETHOD HandleToken(CToken* aToken,nsIParser* aParser);
+
+ /**
+ * This method causes all tokens to be dispatched to the given tag handler.
+ *
+ * @update gess 3/25/98
+ * @param aHandler -- object to receive subsequent tokens...
+ * @return error code (usually 0)
+ */
+ NS_IMETHOD CaptureTokenPump(nsITagHandler* aHandler);
+
+ /**
+ * This method releases the token-pump capture obtained in CaptureTokenPump()
+ *
+ * @update gess 3/25/98
+ * @param aHandler -- object that received tokens...
+ * @return error code (usually 0)
+ */
+ NS_IMETHOD ReleaseTokenPump(nsITagHandler* aHandler);
+
+ /**
+ *
+ * @update gess12/28/98
+ * @param
+ * @return
+ */
+ nsITokenizer* GetTokenizer(void);
+
+ /**
+ *
+ * @update gess5/18/98
+ * @param
+ * @return
+ */
+ NS_IMETHOD WillResumeParse(void);
+
+ /**
+ *
+ * @update gess5/18/98
+ * @param
+ * @return
+ */
+ NS_IMETHOD WillInterruptParse(void);
+
+ /**
+ * Called by the parser to initiate dtd verification of the
+ * internal context stack.
+ * @update gess 7/23/98
+ * @param
+ * @return
+ */
+ virtual PRBool Verify(nsString& aURLRef,nsIParser* aParser);
+
+ /**
+ * Set this to TRUE if you want the DTD to verify its
+ * context stack.
+ * @update gess 7/23/98
+ * @param
+ * @return
+ */
+ virtual void SetVerification(PRBool aEnable);
+
+ /**
+ * This method is called to determine whether or not a tag
+ * of one type can contain a tag of another type.
+ *
+ * @update gess 3/25/98
+ * @param aParent -- int tag of parent container
+ * @param aChild -- int tag of child container
+ * @return PR_TRUE if parent can contain child
+ */
+ virtual PRBool CanContain(PRInt32 aParent,PRInt32 aChild) const;
+
+ /**
+ * This method gets called to determine whether a given
+ * tag is itself a container
+ *
+ * @update gess 3/25/98
+ * @param aTag -- tag to test for containership
+ * @return PR_TRUE if given tag can contain other tags
+ */
+ virtual PRBool IsContainer(PRInt32 aTag) const;
+
+ /**
+ * Retrieve a ptr to the global token recycler...
+ * @update gess8/4/98
+ * @return ptr to recycler (or null)
+ */
+ virtual nsITokenRecycler* GetTokenRecycler(void);
+
+protected:
+
+ nsParser* mParser;
+ nsIContentSink* mSink;
+ nsString mFilename;
+ PRInt32 mLineNumber;
+ nsITokenizer* mTokenizer;
+};
+
+extern NS_HTMLPARS nsresult NS_New_Expat_DTD(nsIDTD** aInstancePtrResult);
+
+
+#endif
+
+
+
diff --git a/mozilla/parser/htmlparser/src/nsExpatTokenizer.cpp b/mozilla/parser/htmlparser/src/nsExpatTokenizer.cpp
new file mode 100644
index 00000000000..d2fea3bea0b
--- /dev/null
+++ b/mozilla/parser/htmlparser/src/nsExpatTokenizer.cpp
@@ -0,0 +1,141 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * The contents of this file are subject to the Netscape Public License
+ * Version 1.0 (the "NPL"); you may not use this file except in
+ * compliance with the NPL. You may obtain a copy of the NPL at
+ * http://www.mozilla.org/NPL/
+ *
+ * Software distributed under the NPL is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
+ * for the specific language governing rights and limitations under the
+ * NPL.
+ *
+ * The Initial Developer of this code under the NPL is Netscape
+ * Communications Corporation. Portions created by Netscape are
+ * Copyright (C) 1998 Netscape Communications Corporation. All Rights
+ * Reserved.
+ */
+
+
+/**
+ * MODULE NOTES:
+ * @update gess 4/1/98
+ *
+ */
+
+#include "nsExpatTokenizer.h"
+#include "nsParser.h"
+#include "nsScanner.h"
+#include "nsDTDUtils.h"
+#include "nsParser.h"
+
+/************************************************************************
+ And now for the main class -- nsExpatTokenizer...
+ ************************************************************************/
+
+static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
+static NS_DEFINE_IID(kITokenizerIID, NS_ITOKENIZER_IID);
+static NS_DEFINE_IID(kHTMLTokenizerIID, NS_HTMLTOKENIZER_IID);
+static NS_DEFINE_IID(kClassIID, NS_EXPATTOKENIZER_IID);
+static nsAutoString gEmpty;
+
+/**
+ * This method gets called as part of our COM-like interfaces.
+ * Its purpose is to create an interface to parser object
+ * of some type.
+ *
+ * @update gess 4/8/98
+ * @param nsIID id of object to discover
+ * @param aInstancePtr ptr to newly discovered interface
+ * @return NS_xxx result code
+ */
+nsresult nsExpatTokenizer::QueryInterface(const nsIID& aIID, void** aInstancePtr)
+{
+ if (NULL == aInstancePtr) {
+ return NS_ERROR_NULL_POINTER;
+ }
+
+ if(aIID.Equals(kISupportsIID)) { //do IUnknown...
+ *aInstancePtr = (nsExpatTokenizer*)(this);
+ }
+ else if(aIID.Equals(kITokenizerIID)) { //do ITOkenizer base class...
+ *aInstancePtr = (nsITokenizer*)(this);
+ }
+ else if(aIID.Equals(kHTMLTokenizerIID)) { //do nsHTMLTokenizer base class...
+ *aInstancePtr = (nsHTMLTokenizer*)(this);
+ }
+ else if(aIID.Equals(kClassIID)) { //do this class...
+ *aInstancePtr = (nsExpatTokenizer*)(this);
+ }
+ else {
+ *aInstancePtr=0;
+ return NS_NOINTERFACE;
+ }
+ NS_ADDREF_THIS();
+ return NS_OK;
+}
+
+
+/**
+ * This method is defined in nsIParser. It is used to
+ * cause the COM-like construction of an nsParser.
+ *
+ * @update gess 4/8/98
+ * @param nsIParser** ptr to newly instantiated parser
+ * @return NS_xxx error result
+ */
+NS_HTMLPARS nsresult NS_New_Expat_Tokenizer(nsIDTD** aInstancePtrResult) {
+ nsExpatTokenizer* it = new nsExpatTokenizer();
+ if (it == 0) {
+ return NS_ERROR_OUT_OF_MEMORY;
+ }
+ return it->QueryInterface(kClassIID, (void **) aInstancePtrResult);
+}
+
+
+NS_IMPL_ADDREF(nsExpatTokenizer)
+NS_IMPL_RELEASE(nsExpatTokenizer)
+
+
+/**
+ * Default constructor
+ *
+ * @update gess 4/9/98
+ * @param
+ * @return
+ */
+nsExpatTokenizer::nsExpatTokenizer() : nsHTMLTokenizer() {
+ NS_INIT_REFCNT();
+}
+
+/**
+ * Default constructor
+ *
+ * @update gess 4/9/98
+ * @param
+ * @return
+ */
+nsExpatTokenizer::~nsExpatTokenizer(){
+}
+
+
+/*******************************************************************
+ Here begins the real working methods for the tokenizer.
+ *******************************************************************/
+
+/**
+ * This method repeatedly called by the tokenizer.
+ * Each time, we determine the kind of token were about to
+ * read, and then we call the appropriate method to handle
+ * that token type.
+ *
+ * @update gess 3/25/98
+ * @param aChar: last char read
+ * @param aScanner: see nsScanner.h
+ * @param anErrorCode: arg that will hold error condition
+ * @return new token or null
+ */
+nsresult nsExpatTokenizer::ConsumeToken(nsScanner& aScanner) {
+ return nsHTMLTokenizer::ConsumeToken(aScanner);
+}
+
diff --git a/mozilla/parser/htmlparser/src/nsExpatTokenizer.h b/mozilla/parser/htmlparser/src/nsExpatTokenizer.h
new file mode 100644
index 00000000000..a98a4fa9210
--- /dev/null
+++ b/mozilla/parser/htmlparser/src/nsExpatTokenizer.h
@@ -0,0 +1,59 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * The contents of this file are subject to the Netscape Public License
+ * Version 1.0 (the "NPL"); you may not use this file except in
+ * compliance with the NPL. You may obtain a copy of the NPL at
+ * http://www.mozilla.org/NPL/
+ *
+ * Software distributed under the NPL is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
+ * for the specific language governing rights and limitations under the
+ * NPL.
+ *
+ * The Initial Developer of this code under the NPL is Netscape
+ * Communications Corporation. Portions created by Netscape are
+ * Copyright (C) 1998 Netscape Communications Corporation. All Rights
+ * Reserved.
+ */
+
+
+/**
+ * MODULE NOTES:
+ * @update gess 4/1/98
+ *
+ */
+
+#ifndef __nsExpatTokenizer
+#define __nsExpatTokenizer
+
+#include "nsISupports.h"
+#include "nsHTMLTokenizer.h"
+#include "prtypes.h"
+
+#define NS_EXPATTOKENIZER_IID \
+ {0x483836aa, 0xcabe, 0x11d2, { 0xab, 0xcb, 0x0, 0x10, 0x4b, 0x98, 0x3f, 0xd4 }}
+
+
+/***************************************************************
+ Notes:
+ ***************************************************************/
+
+#if defined(XP_PC)
+#pragma warning( disable : 4275 )
+#endif
+
+CLASS_EXPORT_HTMLPARS nsExpatTokenizer : public nsHTMLTokenizer {
+public:
+ nsExpatTokenizer();
+ virtual ~nsExpatTokenizer();
+
+ NS_DECL_ISUPPORTS
+
+ virtual nsresult ConsumeToken(nsScanner& aScanner);
+};
+
+extern NS_HTMLPARS nsresult NS_Expat_Tokenizer(nsIDTD** aInstancePtrResult);
+
+#endif
+
+