diff --git a/mozilla/htmlparser/robot/nsDebugRobot.cpp b/mozilla/htmlparser/robot/nsDebugRobot.cpp index c158c15377e..b246d31327a 100644 --- a/mozilla/htmlparser/robot/nsDebugRobot.cpp +++ b/mozilla/htmlparser/robot/nsDebugRobot.cpp @@ -23,7 +23,7 @@ #include "nsString.h" #include "nsIURL.h" #include "nsIStreamListener.h" -#include "nsIParserDebug.h" +#include "nsIDTDDebug.h" static NS_DEFINE_IID(kIRobotSinkObserverIID, NS_IROBOTSINKOBSERVER_IID); @@ -168,14 +168,14 @@ extern "C" NS_EXPORT int DebugRobot( NS_ADDREF(myObserver); g_workList = workList; - nsIParserDebug * pIParserDebug; - nsresult rval = NS_NewParserDebug(&pIParserDebug); + nsIDTDDebug * pIDTDDebug; + nsresult rval = NS_NewDTDDebug(&pIDTDDebug); if (NS_OK != rval) { fputs("Cannot create parser debugger.\n", stdout); NS_RELEASE(myObserver); return -1; } - pIParserDebug->SetVerificationDirectory(verify_dir); + pIDTDDebug->SetVerificationDirectory(verify_dir); for (;;) { PRInt32 n = g_workList->Count(); @@ -192,7 +192,7 @@ extern "C" NS_EXPORT int DebugRobot( printf("invalid URL: '"); fputs(*urlName, stdout); printf("'\n"); - NS_RELEASE(pIParserDebug); + NS_RELEASE(pIDTDDebug); NS_RELEASE(myObserver); return -1; } @@ -211,7 +211,7 @@ extern "C" NS_EXPORT int DebugRobot( rv = NS_NewParser(&parser); if (NS_OK != rv) { printf("can't make parser\n"); - NS_RELEASE(pIParserDebug); + NS_RELEASE(pIDTDDebug); NS_RELEASE(myObserver); return -1; } @@ -220,7 +220,7 @@ extern "C" NS_EXPORT int DebugRobot( rv = NS_NewRobotSink(&sink); if (NS_OK != rv) { printf("can't make parser\n"); - NS_RELEASE(pIParserDebug); + NS_RELEASE(pIDTDDebug); NS_RELEASE(myObserver); return -1; } @@ -229,7 +229,8 @@ extern "C" NS_EXPORT int DebugRobot( parser->SetContentSink(sink); g_bReadyForNextUrl = PR_FALSE; - parser->Parse(url, pl, pIParserDebug);/* XXX hook up stream listener here! */ + + parser->Parse(url, pl, pIDTDDebug);/* XXX hook up stream listener here! */ while (!g_bReadyForNextUrl) { if (yieldProc != NULL) (*yieldProc)(url->GetSpec()); @@ -253,8 +254,8 @@ extern "C" NS_EXPORT int DebugRobot( NS_RELEASE(pl); NS_RELEASE(myObserver); - pIParserDebug->DumpVectorRecord(); - NS_RELEASE(pIParserDebug); + pIDTDDebug->DumpVectorRecord(); + NS_RELEASE(pIDTDDebug); return 0; } diff --git a/mozilla/htmlparser/src/CNavDTD.cpp b/mozilla/htmlparser/src/CNavDTD.cpp index db531c7579d..96b1c87b35b 100644 --- a/mozilla/htmlparser/src/CNavDTD.cpp +++ b/mozilla/htmlparser/src/CNavDTD.cpp @@ -31,7 +31,7 @@ * */ -#include "nsIParserDebug.h" +#include "nsIDTDDebug.h" #include "CNavDTD.h" #include "nsHTMLTokens.h" #include "nsCRT.h" @@ -233,7 +233,7 @@ CNavDTD::CNavDTD() : nsIDTD(), mTokenDeque(gTokenKiller) { NS_INIT_REFCNT(); mParser=0; mFilename=0; - mParserDebug=0; + mDTDDebug=0; nsCRT::zero(mLeafBits,sizeof(mLeafBits)); nsCRT::zero(mContextStack,sizeof(mContextStack)); nsCRT::zero(mStyleStack,sizeof(mStyleStack)); @@ -257,18 +257,34 @@ CNavDTD::~CNavDTD(){ if (mFilename) PL_strfree(mFilename); - if (mParserDebug) - NS_RELEASE(mParserDebug); + if (mDTDDebug) + NS_RELEASE(mDTDDebug); // NS_RELEASE(mSink); } +/** + * + * @update jevering6/23/98 + * @param + * @return + */ + +void CNavDTD::SetDTDDebug(nsIDTDDebug * aDTDDebug) +{ + if (mDTDDebug) + NS_RELEASE(mDTDDebug); + mDTDDebug = aDTDDebug; + if (mDTDDebug) + NS_ADDREF(mDTDDebug); +} + /** * * @update gess5/18/98 * @param * @return */ -PRInt32 CNavDTD::WillBuildModel(const char* aFilename, nsIParserDebug* aParserDebug){ +PRInt32 CNavDTD::WillBuildModel(const char* aFilename){ PRInt32 result=0; if (mFilename) { @@ -279,9 +295,6 @@ PRInt32 CNavDTD::WillBuildModel(const char* aFilename, nsIParserDebug* aParserDe mFilename = PL_strdup(aFilename); } - mParserDebug = aParserDebug; - NS_IF_ADDREF(mParserDebug); - if(mSink) mSink->WillBuildModel(); @@ -329,8 +342,8 @@ PRInt32 CNavDTD::HandleToken(CToken* aToken){ if(aHandler) { result=(*aHandler)(theToken,this); - if (mParserDebug) - mParserDebug->Verify(this, mParser, mContextStackPos, mContextStack, mFilename); + if (mDTDDebug) + mDTDDebug->Verify(this, mParser, mContextStackPos, mContextStack, mFilename); } }//if diff --git a/mozilla/htmlparser/src/CNavDTD.h b/mozilla/htmlparser/src/CNavDTD.h index 1ac44ed2bab..6c6e9fa941a 100644 --- a/mozilla/htmlparser/src/CNavDTD.h +++ b/mozilla/htmlparser/src/CNavDTD.h @@ -42,7 +42,7 @@ class nsParser; class nsIHTMLContentSink; -class nsIParserDebug; +class nsIDTDDebug; class CNavDTD : public nsIDTD { @@ -69,13 +69,21 @@ class CNavDTD : public nsIDTD { */ virtual ~CNavDTD(); + /** + * + * @update jevering6/23/98 + * @param + * @return + */ + virtual void SetDTDDebug(nsIDTDDebug * aDTDDebug); + /** * * @update gess5/18/98 * @param * @return */ - virtual PRInt32 WillBuildModel(const char* aFilename=0, nsIParserDebug* aParserDebug=0); + virtual PRInt32 WillBuildModel(const char* aFilename=0); /** * @@ -348,6 +356,8 @@ class CNavDTD : public nsIDTD { */ PRInt32 HandleStyleToken(CToken* aToken); + + private: /** @@ -680,7 +690,7 @@ protected: PRBool mHasOpenMap; nsDeque mTokenDeque; char* mFilename; - nsIParserDebug* mParserDebug; + nsIDTDDebug* mDTDDebug; }; diff --git a/mozilla/htmlparser/src/COtherDTD.cpp b/mozilla/htmlparser/src/COtherDTD.cpp index 702336c0dc8..b42195705c4 100644 --- a/mozilla/htmlparser/src/COtherDTD.cpp +++ b/mozilla/htmlparser/src/COtherDTD.cpp @@ -31,7 +31,7 @@ * */ -#include "nsIParserDebug.h" +#include "nsIDTDDebug.h" #include "COtherDTD.h" #include "nsHTMLTokens.h" #include "nsCRT.h" @@ -236,7 +236,7 @@ COtherDTD::COtherDTD() : nsIDTD(), mTokenDeque(gTokenKiller) { NS_INIT_REFCNT(); mParser=0; mFilename=0; - mParserDebug=0; + mDTDDebug=0; nsCRT::zero(mLeafBits,sizeof(mLeafBits)); nsCRT::zero(mContextStack,sizeof(mContextStack)); nsCRT::zero(mStyleStack,sizeof(mStyleStack)); @@ -259,18 +259,34 @@ COtherDTD::~COtherDTD(){ DeleteTokenHandlers(); if (mFilename) PL_strfree(mFilename); - if (mParserDebug) - NS_RELEASE(mParserDebug); + if (mDTDDebug) + NS_RELEASE(mDTDDebug); // NS_RELEASE(mSink); } +/** + * + * @update jevering6/23/98 + * @param + * @return + */ + +void COtherDTD::SetDTDDebug(nsIDTDDebug * aDTDDebug) +{ + if (mDTDDebug) + NS_RELEASE(mDTDDebug); + mDTDDebug = aDTDDebug; + if (mDTDDebug) + NS_ADDREF(mDTDDebug); +} + /** * * @update gess5/18/98 * @param * @return */ -PRInt32 COtherDTD::WillBuildModel(const char* aFilename, nsIParserDebug* aParserDebug){ +PRInt32 COtherDTD::WillBuildModel(const char* aFilename){ PRInt32 result=0; if (mFilename) { @@ -281,9 +297,6 @@ PRInt32 COtherDTD::WillBuildModel(const char* aFilename, nsIParserDebug* aParser mFilename = PL_strdup(aFilename); } - mParserDebug = aParserDebug; - NS_IF_ADDREF(mParserDebug); - if(mSink) mSink->WillBuildModel(); @@ -330,8 +343,8 @@ PRInt32 COtherDTD::HandleToken(CToken* aToken){ if(aHandler) { result=(*aHandler)(theToken,this); - if (mParserDebug) - mParserDebug->Verify(this, mParser, mContextStackPos, mContextStack, mFilename); + if (mDTDDebug) + mDTDDebug->Verify(this, mParser, mContextStackPos, mContextStack, mFilename); } }//if diff --git a/mozilla/htmlparser/src/COtherDTD.h b/mozilla/htmlparser/src/COtherDTD.h index aab53f82691..a6b2796ae3e 100644 --- a/mozilla/htmlparser/src/COtherDTD.h +++ b/mozilla/htmlparser/src/COtherDTD.h @@ -41,7 +41,7 @@ class nsParser; class nsIHTMLContentSink; -class nsIParserDebug; +class nsIDTDDebug; class COtherDTD : public nsIDTD { @@ -68,15 +68,21 @@ class COtherDTD : public nsIDTD { */ virtual ~COtherDTD(); - - + /** + * + * @update jevering6/23/98 + * @param + * @return + */ + virtual void SetDTDDebug(nsIDTDDebug * aDTDDebug); + /** * * @update gess5/18/98 * @param * @return */ - virtual PRInt32 WillBuildModel(const char* aFilename=0, nsIParserDebug* aIParserDebug=0); + virtual PRInt32 WillBuildModel(const char* aFilename=0); /** * @@ -681,7 +687,7 @@ protected: PRBool mHasOpenMap; nsDeque mTokenDeque; char* mFilename; - nsIParserDebug* mParserDebug; + nsIDTDDebug* mDTDDebug; }; diff --git a/mozilla/htmlparser/src/Makefile b/mozilla/htmlparser/src/Makefile index b145aa09f0a..d77fffdfcb3 100644 --- a/mozilla/htmlparser/src/Makefile +++ b/mozilla/htmlparser/src/Makefile @@ -24,7 +24,7 @@ DEFINES = -D_IMPL_NS_HTMLPARS CPPSRCS = \ nsHTMLContentSink.cpp \ nsParserNode.cpp \ - nsParserDebug.cpp \ + nsDTDDebug.cpp \ nsScanner.cpp \ nsToken.cpp \ nsTokenHandler.cpp \ diff --git a/mozilla/htmlparser/src/makefile.win b/mozilla/htmlparser/src/makefile.win index 74f7172436a..dcbf67dfcc9 100644 --- a/mozilla/htmlparser/src/makefile.win +++ b/mozilla/htmlparser/src/makefile.win @@ -32,7 +32,7 @@ CPPSRCS=nsHTMLContentSink.cpp \ EXPORTS=nshtmlpars.h nsIContentSink.h nsIHTMLContentSink.h \ nsHTMLTokens.h nsIParserNode.h nsIParser.h nsToken.h \ - nsIParserDebug.h nsIParserFilter.h + nsIDTDDebug.h nsIParserFilter.h CPP_OBJS=.\$(OBJDIR)\nsHTMLContentSink.obj \ .\$(OBJDIR)\CNavDTD.obj \ @@ -40,7 +40,7 @@ CPP_OBJS=.\$(OBJDIR)\nsHTMLContentSink.obj \ .\$(OBJDIR)\nsParser.obj \ .\$(OBJDIR)\nsHTMLTokens.obj .\$(OBJDIR)\nsParserNode.obj \ .\$(OBJDIR)\nsScanner.obj .\$(OBJDIR)\nsToken.obj \ - .\$(OBJDIR)\nsTokenHandler.obj .\$(OBJDIR)\nsParserDebug.obj \ + .\$(OBJDIR)\nsTokenHandler.obj .\$(OBJDIR)\nsDTDDebug.obj \ .\$(OBJDIR)\prstrm.obj LINCS=-I$(PUBLIC)\xpcom -I$(PUBLIC)\raptor -I$(PUBLIC)\netlib diff --git a/mozilla/htmlparser/src/nsIDTD.h b/mozilla/htmlparser/src/nsIDTD.h index 3c6b759df8c..8d6e1fca44a 100644 --- a/mozilla/htmlparser/src/nsIDTD.h +++ b/mozilla/htmlparser/src/nsIDTD.h @@ -37,7 +37,7 @@ class nsIParser; class CToken; class nsIContentSink; -class nsIParserDebug; +class nsIDTDDebug; class nsIURL; class nsIDTD : public nsISupports { @@ -69,7 +69,7 @@ class nsIDTD : public nsISupports { * @param * @return */ - virtual PRInt32 WillBuildModel(const char* aFilename=0, nsIParserDebug* aParserDebug=0)=0; + virtual PRInt32 WillBuildModel(const char* aFilename=0)=0; /** * @@ -124,6 +124,13 @@ class nsIDTD : public nsISupports { */ virtual PRBool CanContain(PRInt32 aParent, PRInt32 aChild) = 0; + /** + * + * @update jevering6/23/98 + * @param + * @return + */ + virtual void SetDTDDebug(nsIDTDDebug * aDTDDebug) = 0; }; diff --git a/mozilla/htmlparser/src/nsIParserDebug.h b/mozilla/htmlparser/src/nsIDTDDebug.h similarity index 84% rename from mozilla/htmlparser/src/nsIParserDebug.h rename to mozilla/htmlparser/src/nsIDTDDebug.h index 51981627764..ddf6409588c 100644 --- a/mozilla/htmlparser/src/nsIParserDebug.h +++ b/mozilla/htmlparser/src/nsIDTDDebug.h @@ -23,14 +23,14 @@ * */ -#ifndef NS_IPARSERDEBUG__ -#define NS_IPARSERDEBUG__ +#ifndef NS_IDTDDEBUG__ +#define NS_IDTDDEBUG__ #include "nsISupports.h" #include "nsHTMLTokens.h" #include "prtypes.h" -#define NS_IPARSERDEBUG_IID \ +#define NS_IDTDDEBUG_IID \ {0x7b68c220, 0x0685, 0x11d2, \ {0xa4, 0xb5, 0x00, 0x80, 0x5f, 0x2a, 0x0e, 0xd2}} @@ -38,7 +38,7 @@ class nsIDTD; class nsParser; -class nsIParserDebug : public nsISupports { +class nsIDTDDebug : public nsISupports { public: @@ -52,6 +52,6 @@ public: }; -extern NS_EXPORT nsresult NS_NewParserDebug(nsIParserDebug** aInstancePtrResult); +extern NS_EXPORT nsresult NS_NewDTDDebug(nsIDTDDebug** aInstancePtrResult); -#endif /* NS_IPARSERDEBUG__ */ \ No newline at end of file +#endif /* NS_IDTDDEBUG__ */ \ No newline at end of file diff --git a/mozilla/htmlparser/src/nsIParser.h b/mozilla/htmlparser/src/nsIParser.h index e2e394f2314..619bcd1b322 100644 --- a/mozilla/htmlparser/src/nsIParser.h +++ b/mozilla/htmlparser/src/nsIParser.h @@ -34,7 +34,7 @@ class nsString; class CToken; class nsIURL; class nsIDTD; -class nsIParserDebug; +class nsIDTDDebug; /** * This class defines the iparser interface. This XPCOM @@ -48,6 +48,7 @@ class nsIParser : public nsISupports { virtual nsIContentSink* SetContentSink(nsIContentSink* aContentSink)=0; virtual void SetDTD(nsIDTD* aDTD)=0; + virtual nsIDTD* GetDTD(void)=0; /** @@ -62,9 +63,9 @@ class nsIParser : public nsISupports { virtual PRInt32 Parse(nsIURL* aURL, nsIStreamListener* aListener, - nsIParserDebug * aDebug = 0) = 0; + nsIDTDDebug * aDTDDebug = 0) = 0; - virtual PRInt32 Parse(const char* aFilename,nsIParserDebug * aDebug = 0)=0; + virtual PRInt32 Parse(const char* aFilename)=0; virtual PRInt32 Parse(nsString& anHTMLString,PRBool appendTokens)=0; diff --git a/mozilla/htmlparser/src/nsParser.cpp b/mozilla/htmlparser/src/nsParser.cpp index ca45dcc4e1d..f0aeb744063 100644 --- a/mozilla/htmlparser/src/nsParser.cpp +++ b/mozilla/htmlparser/src/nsParser.cpp @@ -30,7 +30,7 @@ #include #include "nsIInputStream.h" #include "nsIParserFilter.h" -#include "nsIParserDebug.h" +#include "nsIDTDDebug.h" static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); static NS_DEFINE_IID(kClassIID, NS_PARSER_IID); @@ -86,8 +86,8 @@ CTokenDeallocator gTokenKiller; */ nsParser::nsParser() : mTokenDeque(gTokenKiller) { NS_INIT_REFCNT(); + mDTDDebug = 0; mParserFilter = 0; - mParserDebug = 0; mListener = 0; mTransferBuffer=0; mSink=0; @@ -108,6 +108,7 @@ nsParser::nsParser() : mTokenDeque(gTokenKiller) { */ nsParser::~nsParser() { NS_IF_RELEASE(mListener); + NS_IF_RELEASE(mDTDDebug); if(mTransferBuffer) delete [] mTransferBuffer; mTransferBuffer=0; @@ -120,7 +121,6 @@ nsParser::~nsParser() { mScanner=0; NS_IF_RELEASE(mDTD); - NS_IF_RELEASE(mParserDebug); NS_IF_RELEASE(mURL); } @@ -334,16 +334,17 @@ PRBool nsParser::DetermineContentType(const char* aContentType) { * @param * @return */ -PRInt32 nsParser::WillBuildModel(const char* aFilename, const char* aContentType, nsIParserDebug * aDebug){ +PRInt32 nsParser::WillBuildModel(const char* aFilename, const char* aContentType){ mMajorIteration=-1; mMinorIteration=-1; mParseMode=DetermineParseMode(); mDTD=(0==mDTD) ? CreateDTD(mParseMode,aContentType) : mDTD; if(mDTD) { + mDTD->SetDTDDebug(mDTDDebug); mDTD->SetParser(this); mDTD->SetContentSink(mSink); - mDTD->WillBuildModel(aFilename,mParserDebug); + mDTD->WillBuildModel(aFilename); } #ifdef DEBUG_SAVE_SOURCE_DOC @@ -394,20 +395,17 @@ PRInt32 nsParser::DidBuildModel(PRInt32 anErrorCode) { * @param aFilename -- const char* containing file to be parsed. * @return PR_TRUE if parse succeeded, PR_FALSE otherwise. */ -PRBool nsParser::Parse(const char* aFilename,nsIParserDebug* aParserDebug){ +PRBool nsParser::Parse(const char* aFilename){ NS_PRECONDITION(0!=aFilename,kNullFilename); PRInt32 status=kBadFilename; if(aFilename) { - mParserDebug = aParserDebug; - NS_IF_ADDREF(mParserDebug); - //ok, time to create our tokenizer and begin the process mScanner=new CScanner(aFilename,mParseMode); char theContentType[600]; DetermineContentType(theContentType); - WillBuildModel(aFilename,theContentType,aParserDebug); + WillBuildModel(aFilename,theContentType); status=ResumeParse(); DidBuildModel(status); @@ -429,14 +427,13 @@ PRBool nsParser::Parse(const char* aFilename,nsIParserDebug* aParserDebug){ * @param aFilename -- const char* containing file to be parsed. * @return PR_TRUE if parse succeeded, PR_FALSE otherwise. */ -PRInt32 nsParser::Parse(nsIURL* aURL,nsIStreamListener* aListener,nsIParserDebug* aParserDebug) { +PRInt32 nsParser::Parse(nsIURL* aURL,nsIStreamListener* aListener, nsIDTDDebug * aDTDDebug) { NS_PRECONDITION(0!=aURL,kNullURL); PRInt32 status=kBadURL; - NS_IF_RELEASE(mParserDebug); - mParserDebug = aParserDebug; - NS_IF_ADDREF(mParserDebug); + mDTDDebug = aDTDDebug; + NS_IF_ADDREF(mDTDDebug); NS_IF_RELEASE(mURL); mURL = aURL; @@ -594,7 +591,7 @@ nsresult nsParser::OnStartBinding(const char* aContentType){ if (nsnull != mListener) { mListener->OnStartBinding(aContentType); } - nsresult result=WillBuildModel(mURL->GetSpec(),aContentType,mParserDebug); + nsresult result=WillBuildModel(mURL->GetSpec(),aContentType); if(!mTransferBuffer) { mTransferBuffer=new char[gTransferBufferSize+1]; } diff --git a/mozilla/htmlparser/src/nsParser.h b/mozilla/htmlparser/src/nsParser.h index d46127dc875..e21e00052be 100644 --- a/mozilla/htmlparser/src/nsParser.h +++ b/mozilla/htmlparser/src/nsParser.h @@ -72,9 +72,9 @@ class IContentSink; class nsIHTMLContentSink; class nsIURL; class nsIDTD; +class nsIDTDDebug; class CScanner; class nsIParserFilter; -class nsIParserDebug; class nsParser : public nsIParser, public nsIStreamListener { @@ -129,8 +129,7 @@ friend class CTokenHandler; * @return TRUE if all went well -- FALSE otherwise */ virtual PRInt32 Parse(nsIURL* aURL, - nsIStreamListener* aListener, - nsIParserDebug * aDebug = 0); + nsIStreamListener* aListener, nsIDTDDebug * aDTDDebug = 0); /** * Cause parser to parse input from given file in given mode @@ -139,7 +138,7 @@ friend class CTokenHandler; * @param aMode is the desired parser mode (Nav, other, etc.) * @return TRUE if all went well -- FALSE otherwise */ - virtual PRInt32 Parse(const char* aFilename,nsIParserDebug * aDebug = 0); + virtual PRInt32 Parse(const char* aFilename); /** * @update gess5/11/98 @@ -205,7 +204,7 @@ protected: * @param * @return */ - PRInt32 WillBuildModel(const char* aFilename=0,const char* aContentType=0, nsIParserDebug* aDebug=0); + PRInt32 WillBuildModel(const char* aFilename=0,const char* aContentType=0); /** * @@ -324,8 +323,8 @@ protected: nsDeque mTokenDeque; CScanner* mScanner; - nsIParserDebug* mParserDebug; nsIURL* mURL; + nsIDTDDebug* mDTDDebug; }; diff --git a/mozilla/htmlparser/src/nsParserDebug.cpp b/mozilla/htmlparser/src/nsParserDebug.cpp deleted file mode 100644 index dfa20caa14e..00000000000 --- a/mozilla/htmlparser/src/nsParserDebug.cpp +++ /dev/null @@ -1,535 +0,0 @@ -/* -*- 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 jevering 06/18/98 - * - * This file contains the parser debugger object which aids in - * walking links and reporting statistic information, reporting - * bad vectors. - */ - -#include "CNavDTD.h" -#include "nsHTMLTokens.h" -#include "nsParser.h" -#include "nsIParserDebug.h" -#include "nsCRT.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" -#include "prstrm.h" -#include -#include -#include "prmem.h" - -#define CONTEXT_VECTOR_MAP "/vector.map" -#define CONTEXT_VECTOR_STAT "/vector.stat" -#define VECTOR_TABLE_HEADER "count vector\r\n====== =============================================\r\n" - -// structure to store the vector statistic information - -typedef struct vector_info { - PRInt32 references; // number of occurances counted - PRInt32 count; // number of tags in the vector - PRBool good_vector; // is this a valid vector? - eHTMLTags* vector; // and the vector -} VectorInfo; - -// the statistic vector table grows each time it exceeds this -// stepping value -#define TABLE_SIZE 128 - -class CParserDebug : public nsIParserDebug { -public: - - CParserDebug(char * aVerifyDir = 0); - ~CParserDebug(); - - NS_DECL_ISUPPORTS - - void SetVerificationDirectory(char * verify_dir); - void SetRecordStatistics(PRBool bval); - PRBool Verify(nsIDTD * aDTD, nsParser * aParser, int ContextStackPos, eHTMLTags aContextStack[], char * aURLRef); - void DumpVectorRecord(void); - - // global table for storing vector statistics and the size - -private: - VectorInfo ** mVectorInfoArray; - PRInt32 mVectorCount; - char * mVerificationDir; - PRBool mRecordingStatistics; - - PRBool DebugRecord(char * path, char * pURLRef, char * filename); - void NoteVector(eHTMLTags aTags[],PRInt32 count, PRBool good_vector); - void MakeVectorString(char * vector_string, VectorInfo * pInfo); -}; - -static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); -static NS_DEFINE_IID(kIDebugParserIID, NS_IPARSERDEBUG_IID); - -/** - * This method is defined in nsIParser. It is used to - * cause the COM-like construction of an nsParser. - * - * @update jevering 3/25/98 - * @param nsIParser** ptr to newly instantiated parser - * @return NS_xxx error result - */ - -NS_EXPORT nsresult NS_NewParserDebug(nsIParserDebug** aInstancePtrResult) -{ - CParserDebug *it = new CParserDebug(); - - if (it == 0) { - return NS_ERROR_OUT_OF_MEMORY; - } - - return it->QueryInterface(kIDebugParserIID, (void **)aInstancePtrResult); -} - -CParserDebug::CParserDebug(char * aVerifyDir) -{ - NS_INIT_REFCNT(); - mVectorInfoArray = 0; - mVectorCount = 0; - if (aVerifyDir) - mVerificationDir = PL_strdup(aVerifyDir); - else { - char * pString = PR_GetEnv("VERIFY_PARSER"); - if (pString) - mVerificationDir = PL_strdup(pString); - else - mVerificationDir = 0; - } - mRecordingStatistics = PR_TRUE; -} - -CParserDebug::~CParserDebug() -{ - if (mVerificationDir) - PL_strfree(mVerificationDir); -} - -/** - * 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 CParserDebug::QueryInterface(const nsIID& aIID, void** aInstancePtr) -{ - if (NULL == aInstancePtr) { - return NS_ERROR_NULL_POINTER; - } - - if(aIID.Equals(kISupportsIID)) { //do IUnknown... - *aInstancePtr = (nsIParserDebug*)(this); - } - else if(aIID.Equals(kIDebugParserIID)) { //do IParserDebug base class... - *aInstancePtr = (nsIParserDebug*)(this); - } - else { - *aInstancePtr=0; - return NS_NOINTERFACE; - } - ((nsISupports*) *aInstancePtr)->AddRef(); - return NS_OK; -} - -NS_IMPL_ADDREF(CParserDebug) -NS_IMPL_RELEASE(CParserDebug) - -void CParserDebug::SetVerificationDirectory(char * verify_dir) -{ - if (mVerificationDir) { - PL_strfree(mVerificationDir); - mVerificationDir = 0; - } - mVerificationDir = PL_strdup(verify_dir); -} - -void CParserDebug::SetRecordStatistics(PRBool bval) -{ - mRecordingStatistics = bval; -} - -/** - * This debug method records an invalid context vector and it's - * associated context vector and URL in a simple flat file mapping which - * resides in the verification directory and is named context.map - * - * @update jevering 6/06/98 - * @param path is the directory structure indicating the bad context vector - * @param pURLRef is the associated URL - * @param filename to record mapping to if not already recorded - * @return TRUE if it is already record (dont rerecord) - */ - -PRBool CParserDebug::DebugRecord(char * path, char * pURLRef, char * filename) -{ - char recordPath[2048]; - PRIntn oflags = 0; - - // create the record file name from the verification director - // and the default name. - strcpy(recordPath,mVerificationDir); - strcat(recordPath,CONTEXT_VECTOR_MAP); - - // create the file exists, only open for read/write - // otherwise, create it - if(PR_Access(recordPath,PR_ACCESS_EXISTS) != PR_SUCCESS) - oflags = PR_CREATE_FILE; - oflags |= PR_RDWR; - - // open the record file - PRFileDesc * recordFile = PR_Open(recordPath,oflags,0); - - if (recordFile) { - - char * string = (char *)PR_Malloc(2048); - PRBool found = PR_FALSE; - - // vectors are stored on the format iof "URL vector filename" - // where the vector contains the verification path and - // the filename contains the debug source dump - sprintf(string,"%s %s %s\r\n", pURLRef, path, filename); - - // get the file size, read in the file and parse it line at - // a time to check to see if we have already recorded this - // occurance - - PRInt32 iSize = PR_Seek(recordFile,0,PR_SEEK_END); - if (iSize) { - - char * buffer = (char*)PR_Malloc(iSize); - char * stringbuf = (char*)PR_Calloc(sizeof(char*),2048); - if (buffer!=NULL && string!=NULL) { - PRInt32 ibufferpos, istringpos; - - // beginning of file for read - PR_Seek(recordFile,0,PR_SEEK_SET); - PR_Read(recordFile,buffer,iSize); - - // run through the file looking for a matching vector - for (ibufferpos = istringpos = 0; ibufferpos < iSize; ibufferpos++) - { - // compare string once we have hit the end of the line - if (buffer[ibufferpos] == '\r') { - stringbuf[istringpos] = '\0'; - istringpos = 0; - // skip newline and space - ibufferpos++; - - if (PL_strlen(stringbuf)) { - char * space; - // chop of the filename for compare - if ((space = PL_strrchr(stringbuf, ' '))!=NULL) - *space = '\0'; - - // we have already recorded this one, free up, and return - if (!PL_strncmp(string,stringbuf,PL_strlen(stringbuf))) { - PR_Free(buffer); - PR_Free(stringbuf); - PR_Free(string); - return PR_TRUE; - } - } - } - - // build up the compare string - else - stringbuf[istringpos++] = buffer[ibufferpos]; - } - - // throw away the record file data - PR_Free(buffer); - PR_Free(stringbuf); - } - } - - // if this bad vector was not recorded, add it to record file - - if (!found) { - PR_Seek(recordFile,0,PR_SEEK_END); - PR_Write(recordFile,string,PL_strlen(string)); - } - - PR_Close(recordFile); - PR_Free(string); - } - - // vector was not recorded - return PR_FALSE; -} - -/** - * compare function for quick sort. Compares references and - * sorts in decending order - */ - -static int compare( const void *arg1, const void *arg2 ) -{ - VectorInfo ** p1 = (VectorInfo**)arg1; - VectorInfo ** p2 = (VectorInfo**)arg2; - return (*p2)->references - (*p1)->references; -} - -/** - * This debug routines stores statistical information about a - * context vector. The context vector statistics are stored in - * a global array. The table is resorted each time it grows to - * aid in lookup speed. If a vector has already been noted, its - * reference count is bumped, otherwise it is added to the table - * - * @update jevering 6/11/98 - * @param aTags is the tag list (vector) - * @param count is the size of the vector - * @return - */ - -void CParserDebug::NoteVector(eHTMLTags aTags[],PRInt32 count, PRBool good_vector) -{ - // if the table doesn't exist, create it - if (!mVectorInfoArray) { - mVectorInfoArray = (VectorInfo**)PR_Calloc(TABLE_SIZE,sizeof(VectorInfo*)); - } - else { - // attempt to look up the vector - for (PRInt32 i = 0; i < mVectorCount; i++) - - // check the vector only if they are the same size, if they - // match then just return without doing further work - if (mVectorInfoArray[i]->count == count) - if (!memcmp(mVectorInfoArray[i]->vector, aTags, sizeof(eHTMLTags)*count)) { - - // bzzzt. and we have a winner.. bump the ref count - mVectorInfoArray[i]->references++; - return; - } - } - - // the context vector hasn't been noted, so allocate it and - // initialize it one.. add it to the table - VectorInfo * pVectorInfo = (VectorInfo*)PR_Malloc(sizeof(VectorInfo)); - pVectorInfo->references = 1; - pVectorInfo->count = count; - pVectorInfo->good_vector = good_vector; - pVectorInfo->vector = (eHTMLTags*)PR_Malloc(count*sizeof(eHTMLTags)); - memcpy(pVectorInfo->vector,aTags,sizeof(eHTMLTags)*count); - mVectorInfoArray[mVectorCount++] = pVectorInfo; - - // have we maxed out the table? grow it.. sort it.. love it. - if ((mVectorCount % TABLE_SIZE) == 0) { - mVectorInfoArray = (VectorInfo**)realloc( - mVectorInfoArray, - (sizeof(VectorInfo*)*((mVectorCount/TABLE_SIZE)+1)*TABLE_SIZE)); - if (mVectorCount) { - qsort((void*)mVectorInfoArray,(size_t)mVectorCount,sizeof(VectorInfo*),compare); - } - } -} - -void CParserDebug::MakeVectorString(char * vector_string, VectorInfo * pInfo) -{ - sprintf (vector_string, "%6d ", pInfo->references); - for (PRInt32 j = 0; j < pInfo->count; j++) { - PL_strcat(vector_string, "<"); - PL_strcat(vector_string, (const char *)GetTagName(pInfo->vector[j])); - PL_strcat(vector_string, ">"); - } - PL_strcat(vector_string,"\r\n"); -} - -/** - * This debug routine dumps out the vector statistics to a text - * file in the verification directory and defaults to the name - * "vector.stat". It contains all parsed context vectors and there - * occurance count sorted in decending order. - * - * @update jevering 6/11/98 - * @param - * @return - */ - -void CParserDebug::DumpVectorRecord(void) -{ - // do we have a table? - if (mVectorCount) { - - // hopefully, they wont exceed 1K. - char vector_string[1024]; - char path[1024]; - - path[0] = '\0'; - - // put in the verification directory.. else the root - if (mVerificationDir) - strcpy(path,mVerificationDir); - - strcat(path,CONTEXT_VECTOR_STAT); - - // open the stat file creaming any existing stat file - PRFileDesc * statisticFile = PR_Open(path,PR_CREATE_FILE|PR_RDWR,0); - if (statisticFile) { - - PRInt32 i; - PRofstream ps; - ps.attach(statisticFile); - - // oh what the heck, sort it again - if (mVectorCount) { - qsort((void*)mVectorInfoArray,(size_t)mVectorCount,sizeof(VectorInfo*),compare); - } - - // cute little header - sprintf(vector_string,"Context vector occurance results. Processed %d unique vectors.\r\n\r\n", mVectorCount); - ps << vector_string; - - ps << "Invalid context vector summary (see " CONTEXT_VECTOR_STAT ") for mapping.\r\n"; - ps << VECTOR_TABLE_HEADER; - - // dump out the bad vectors encountered - for (i = 0; i < mVectorCount; i++) { - if (!mVectorInfoArray[i]->good_vector) { - MakeVectorString(vector_string, mVectorInfoArray[i]); - ps << vector_string; - } - } - - ps << "\r\n\r\nValid context vector summary\r\n"; - ps << VECTOR_TABLE_HEADER; - - // take a big vector table dump (good vectors) - for (i = 0; i < mVectorCount; i++) { - if (mVectorInfoArray[i]->good_vector) { - MakeVectorString(vector_string, mVectorInfoArray[i]); - ps << vector_string; - } - // free em up. they mean nothing to me now (I'm such a user) - - if (mVectorInfoArray[i]->vector) - PR_Free(mVectorInfoArray[i]->vector); - PR_Free(mVectorInfoArray[i]); - } //for - PR_Close(statisticFile); - }//if - - // ok, we are done with the table, free it up as well - PR_Free(mVectorInfoArray); - mVectorInfoArray = 0; - mVectorCount = 0; - - } //if -} - - -/** - * This debug method allows us to determine whether or not - * we've seen (and can handle) the given context vector. - * - * @update gess4/22/98 - * @param tags is an array of eHTMLTags - * @param count represents the number of items in the tags array - * @param aDTD is the DTD we plan to ask for verification - * @return TRUE if we know how to handle it, else false - */ - -PRBool CParserDebug::Verify(nsIDTD * aDTD, nsParser * aParser, int aContextStackPos, eHTMLTags aContextStack[], char * aURLRef) -{ - PRBool result=PR_TRUE; - - //ok, now see if we understand this vector - - if(0!=mVerificationDir || mRecordingStatistics) { - - if(aDTD && aContextStackPos>1) { - for (int i = 0; i < aContextStackPos-1; i++) - if (!aDTD->CanContain(aContextStack[i],aContextStack[i+1])) { - result = PR_FALSE; - break; - } - } - } - - if (mRecordingStatistics) { - NoteVector(aContextStack,aContextStackPos,result); - } - - if(0!=mVerificationDir) { - char path[2048]; - strcpy(path,mVerificationDir); - - int i=0; - for(i=0;iDebugDumpSource(ps); - PR_Close(debugFile); - } - } - } - } - - return result; -} diff --git a/mozilla/parser/htmlparser/robot/nsDebugRobot.cpp b/mozilla/parser/htmlparser/robot/nsDebugRobot.cpp index c158c15377e..b246d31327a 100644 --- a/mozilla/parser/htmlparser/robot/nsDebugRobot.cpp +++ b/mozilla/parser/htmlparser/robot/nsDebugRobot.cpp @@ -23,7 +23,7 @@ #include "nsString.h" #include "nsIURL.h" #include "nsIStreamListener.h" -#include "nsIParserDebug.h" +#include "nsIDTDDebug.h" static NS_DEFINE_IID(kIRobotSinkObserverIID, NS_IROBOTSINKOBSERVER_IID); @@ -168,14 +168,14 @@ extern "C" NS_EXPORT int DebugRobot( NS_ADDREF(myObserver); g_workList = workList; - nsIParserDebug * pIParserDebug; - nsresult rval = NS_NewParserDebug(&pIParserDebug); + nsIDTDDebug * pIDTDDebug; + nsresult rval = NS_NewDTDDebug(&pIDTDDebug); if (NS_OK != rval) { fputs("Cannot create parser debugger.\n", stdout); NS_RELEASE(myObserver); return -1; } - pIParserDebug->SetVerificationDirectory(verify_dir); + pIDTDDebug->SetVerificationDirectory(verify_dir); for (;;) { PRInt32 n = g_workList->Count(); @@ -192,7 +192,7 @@ extern "C" NS_EXPORT int DebugRobot( printf("invalid URL: '"); fputs(*urlName, stdout); printf("'\n"); - NS_RELEASE(pIParserDebug); + NS_RELEASE(pIDTDDebug); NS_RELEASE(myObserver); return -1; } @@ -211,7 +211,7 @@ extern "C" NS_EXPORT int DebugRobot( rv = NS_NewParser(&parser); if (NS_OK != rv) { printf("can't make parser\n"); - NS_RELEASE(pIParserDebug); + NS_RELEASE(pIDTDDebug); NS_RELEASE(myObserver); return -1; } @@ -220,7 +220,7 @@ extern "C" NS_EXPORT int DebugRobot( rv = NS_NewRobotSink(&sink); if (NS_OK != rv) { printf("can't make parser\n"); - NS_RELEASE(pIParserDebug); + NS_RELEASE(pIDTDDebug); NS_RELEASE(myObserver); return -1; } @@ -229,7 +229,8 @@ extern "C" NS_EXPORT int DebugRobot( parser->SetContentSink(sink); g_bReadyForNextUrl = PR_FALSE; - parser->Parse(url, pl, pIParserDebug);/* XXX hook up stream listener here! */ + + parser->Parse(url, pl, pIDTDDebug);/* XXX hook up stream listener here! */ while (!g_bReadyForNextUrl) { if (yieldProc != NULL) (*yieldProc)(url->GetSpec()); @@ -253,8 +254,8 @@ extern "C" NS_EXPORT int DebugRobot( NS_RELEASE(pl); NS_RELEASE(myObserver); - pIParserDebug->DumpVectorRecord(); - NS_RELEASE(pIParserDebug); + pIDTDDebug->DumpVectorRecord(); + NS_RELEASE(pIDTDDebug); return 0; } diff --git a/mozilla/parser/htmlparser/src/CNavDTD.cpp b/mozilla/parser/htmlparser/src/CNavDTD.cpp index db531c7579d..96b1c87b35b 100644 --- a/mozilla/parser/htmlparser/src/CNavDTD.cpp +++ b/mozilla/parser/htmlparser/src/CNavDTD.cpp @@ -31,7 +31,7 @@ * */ -#include "nsIParserDebug.h" +#include "nsIDTDDebug.h" #include "CNavDTD.h" #include "nsHTMLTokens.h" #include "nsCRT.h" @@ -233,7 +233,7 @@ CNavDTD::CNavDTD() : nsIDTD(), mTokenDeque(gTokenKiller) { NS_INIT_REFCNT(); mParser=0; mFilename=0; - mParserDebug=0; + mDTDDebug=0; nsCRT::zero(mLeafBits,sizeof(mLeafBits)); nsCRT::zero(mContextStack,sizeof(mContextStack)); nsCRT::zero(mStyleStack,sizeof(mStyleStack)); @@ -257,18 +257,34 @@ CNavDTD::~CNavDTD(){ if (mFilename) PL_strfree(mFilename); - if (mParserDebug) - NS_RELEASE(mParserDebug); + if (mDTDDebug) + NS_RELEASE(mDTDDebug); // NS_RELEASE(mSink); } +/** + * + * @update jevering6/23/98 + * @param + * @return + */ + +void CNavDTD::SetDTDDebug(nsIDTDDebug * aDTDDebug) +{ + if (mDTDDebug) + NS_RELEASE(mDTDDebug); + mDTDDebug = aDTDDebug; + if (mDTDDebug) + NS_ADDREF(mDTDDebug); +} + /** * * @update gess5/18/98 * @param * @return */ -PRInt32 CNavDTD::WillBuildModel(const char* aFilename, nsIParserDebug* aParserDebug){ +PRInt32 CNavDTD::WillBuildModel(const char* aFilename){ PRInt32 result=0; if (mFilename) { @@ -279,9 +295,6 @@ PRInt32 CNavDTD::WillBuildModel(const char* aFilename, nsIParserDebug* aParserDe mFilename = PL_strdup(aFilename); } - mParserDebug = aParserDebug; - NS_IF_ADDREF(mParserDebug); - if(mSink) mSink->WillBuildModel(); @@ -329,8 +342,8 @@ PRInt32 CNavDTD::HandleToken(CToken* aToken){ if(aHandler) { result=(*aHandler)(theToken,this); - if (mParserDebug) - mParserDebug->Verify(this, mParser, mContextStackPos, mContextStack, mFilename); + if (mDTDDebug) + mDTDDebug->Verify(this, mParser, mContextStackPos, mContextStack, mFilename); } }//if diff --git a/mozilla/parser/htmlparser/src/CNavDTD.h b/mozilla/parser/htmlparser/src/CNavDTD.h index 1ac44ed2bab..6c6e9fa941a 100644 --- a/mozilla/parser/htmlparser/src/CNavDTD.h +++ b/mozilla/parser/htmlparser/src/CNavDTD.h @@ -42,7 +42,7 @@ class nsParser; class nsIHTMLContentSink; -class nsIParserDebug; +class nsIDTDDebug; class CNavDTD : public nsIDTD { @@ -69,13 +69,21 @@ class CNavDTD : public nsIDTD { */ virtual ~CNavDTD(); + /** + * + * @update jevering6/23/98 + * @param + * @return + */ + virtual void SetDTDDebug(nsIDTDDebug * aDTDDebug); + /** * * @update gess5/18/98 * @param * @return */ - virtual PRInt32 WillBuildModel(const char* aFilename=0, nsIParserDebug* aParserDebug=0); + virtual PRInt32 WillBuildModel(const char* aFilename=0); /** * @@ -348,6 +356,8 @@ class CNavDTD : public nsIDTD { */ PRInt32 HandleStyleToken(CToken* aToken); + + private: /** @@ -680,7 +690,7 @@ protected: PRBool mHasOpenMap; nsDeque mTokenDeque; char* mFilename; - nsIParserDebug* mParserDebug; + nsIDTDDebug* mDTDDebug; }; diff --git a/mozilla/parser/htmlparser/src/COtherDTD.cpp b/mozilla/parser/htmlparser/src/COtherDTD.cpp index 702336c0dc8..b42195705c4 100644 --- a/mozilla/parser/htmlparser/src/COtherDTD.cpp +++ b/mozilla/parser/htmlparser/src/COtherDTD.cpp @@ -31,7 +31,7 @@ * */ -#include "nsIParserDebug.h" +#include "nsIDTDDebug.h" #include "COtherDTD.h" #include "nsHTMLTokens.h" #include "nsCRT.h" @@ -236,7 +236,7 @@ COtherDTD::COtherDTD() : nsIDTD(), mTokenDeque(gTokenKiller) { NS_INIT_REFCNT(); mParser=0; mFilename=0; - mParserDebug=0; + mDTDDebug=0; nsCRT::zero(mLeafBits,sizeof(mLeafBits)); nsCRT::zero(mContextStack,sizeof(mContextStack)); nsCRT::zero(mStyleStack,sizeof(mStyleStack)); @@ -259,18 +259,34 @@ COtherDTD::~COtherDTD(){ DeleteTokenHandlers(); if (mFilename) PL_strfree(mFilename); - if (mParserDebug) - NS_RELEASE(mParserDebug); + if (mDTDDebug) + NS_RELEASE(mDTDDebug); // NS_RELEASE(mSink); } +/** + * + * @update jevering6/23/98 + * @param + * @return + */ + +void COtherDTD::SetDTDDebug(nsIDTDDebug * aDTDDebug) +{ + if (mDTDDebug) + NS_RELEASE(mDTDDebug); + mDTDDebug = aDTDDebug; + if (mDTDDebug) + NS_ADDREF(mDTDDebug); +} + /** * * @update gess5/18/98 * @param * @return */ -PRInt32 COtherDTD::WillBuildModel(const char* aFilename, nsIParserDebug* aParserDebug){ +PRInt32 COtherDTD::WillBuildModel(const char* aFilename){ PRInt32 result=0; if (mFilename) { @@ -281,9 +297,6 @@ PRInt32 COtherDTD::WillBuildModel(const char* aFilename, nsIParserDebug* aParser mFilename = PL_strdup(aFilename); } - mParserDebug = aParserDebug; - NS_IF_ADDREF(mParserDebug); - if(mSink) mSink->WillBuildModel(); @@ -330,8 +343,8 @@ PRInt32 COtherDTD::HandleToken(CToken* aToken){ if(aHandler) { result=(*aHandler)(theToken,this); - if (mParserDebug) - mParserDebug->Verify(this, mParser, mContextStackPos, mContextStack, mFilename); + if (mDTDDebug) + mDTDDebug->Verify(this, mParser, mContextStackPos, mContextStack, mFilename); } }//if diff --git a/mozilla/parser/htmlparser/src/COtherDTD.h b/mozilla/parser/htmlparser/src/COtherDTD.h index aab53f82691..a6b2796ae3e 100644 --- a/mozilla/parser/htmlparser/src/COtherDTD.h +++ b/mozilla/parser/htmlparser/src/COtherDTD.h @@ -41,7 +41,7 @@ class nsParser; class nsIHTMLContentSink; -class nsIParserDebug; +class nsIDTDDebug; class COtherDTD : public nsIDTD { @@ -68,15 +68,21 @@ class COtherDTD : public nsIDTD { */ virtual ~COtherDTD(); - - + /** + * + * @update jevering6/23/98 + * @param + * @return + */ + virtual void SetDTDDebug(nsIDTDDebug * aDTDDebug); + /** * * @update gess5/18/98 * @param * @return */ - virtual PRInt32 WillBuildModel(const char* aFilename=0, nsIParserDebug* aIParserDebug=0); + virtual PRInt32 WillBuildModel(const char* aFilename=0); /** * @@ -681,7 +687,7 @@ protected: PRBool mHasOpenMap; nsDeque mTokenDeque; char* mFilename; - nsIParserDebug* mParserDebug; + nsIDTDDebug* mDTDDebug; }; diff --git a/mozilla/parser/htmlparser/src/Makefile b/mozilla/parser/htmlparser/src/Makefile index b145aa09f0a..d77fffdfcb3 100644 --- a/mozilla/parser/htmlparser/src/Makefile +++ b/mozilla/parser/htmlparser/src/Makefile @@ -24,7 +24,7 @@ DEFINES = -D_IMPL_NS_HTMLPARS CPPSRCS = \ nsHTMLContentSink.cpp \ nsParserNode.cpp \ - nsParserDebug.cpp \ + nsDTDDebug.cpp \ nsScanner.cpp \ nsToken.cpp \ nsTokenHandler.cpp \ diff --git a/mozilla/parser/htmlparser/src/makefile.win b/mozilla/parser/htmlparser/src/makefile.win index 74f7172436a..dcbf67dfcc9 100644 --- a/mozilla/parser/htmlparser/src/makefile.win +++ b/mozilla/parser/htmlparser/src/makefile.win @@ -32,7 +32,7 @@ CPPSRCS=nsHTMLContentSink.cpp \ EXPORTS=nshtmlpars.h nsIContentSink.h nsIHTMLContentSink.h \ nsHTMLTokens.h nsIParserNode.h nsIParser.h nsToken.h \ - nsIParserDebug.h nsIParserFilter.h + nsIDTDDebug.h nsIParserFilter.h CPP_OBJS=.\$(OBJDIR)\nsHTMLContentSink.obj \ .\$(OBJDIR)\CNavDTD.obj \ @@ -40,7 +40,7 @@ CPP_OBJS=.\$(OBJDIR)\nsHTMLContentSink.obj \ .\$(OBJDIR)\nsParser.obj \ .\$(OBJDIR)\nsHTMLTokens.obj .\$(OBJDIR)\nsParserNode.obj \ .\$(OBJDIR)\nsScanner.obj .\$(OBJDIR)\nsToken.obj \ - .\$(OBJDIR)\nsTokenHandler.obj .\$(OBJDIR)\nsParserDebug.obj \ + .\$(OBJDIR)\nsTokenHandler.obj .\$(OBJDIR)\nsDTDDebug.obj \ .\$(OBJDIR)\prstrm.obj LINCS=-I$(PUBLIC)\xpcom -I$(PUBLIC)\raptor -I$(PUBLIC)\netlib diff --git a/mozilla/parser/htmlparser/src/nsIDTD.h b/mozilla/parser/htmlparser/src/nsIDTD.h index 3c6b759df8c..8d6e1fca44a 100644 --- a/mozilla/parser/htmlparser/src/nsIDTD.h +++ b/mozilla/parser/htmlparser/src/nsIDTD.h @@ -37,7 +37,7 @@ class nsIParser; class CToken; class nsIContentSink; -class nsIParserDebug; +class nsIDTDDebug; class nsIURL; class nsIDTD : public nsISupports { @@ -69,7 +69,7 @@ class nsIDTD : public nsISupports { * @param * @return */ - virtual PRInt32 WillBuildModel(const char* aFilename=0, nsIParserDebug* aParserDebug=0)=0; + virtual PRInt32 WillBuildModel(const char* aFilename=0)=0; /** * @@ -124,6 +124,13 @@ class nsIDTD : public nsISupports { */ virtual PRBool CanContain(PRInt32 aParent, PRInt32 aChild) = 0; + /** + * + * @update jevering6/23/98 + * @param + * @return + */ + virtual void SetDTDDebug(nsIDTDDebug * aDTDDebug) = 0; }; diff --git a/mozilla/parser/htmlparser/src/nsIParserDebug.h b/mozilla/parser/htmlparser/src/nsIDTDDebug.h similarity index 84% rename from mozilla/parser/htmlparser/src/nsIParserDebug.h rename to mozilla/parser/htmlparser/src/nsIDTDDebug.h index 51981627764..ddf6409588c 100644 --- a/mozilla/parser/htmlparser/src/nsIParserDebug.h +++ b/mozilla/parser/htmlparser/src/nsIDTDDebug.h @@ -23,14 +23,14 @@ * */ -#ifndef NS_IPARSERDEBUG__ -#define NS_IPARSERDEBUG__ +#ifndef NS_IDTDDEBUG__ +#define NS_IDTDDEBUG__ #include "nsISupports.h" #include "nsHTMLTokens.h" #include "prtypes.h" -#define NS_IPARSERDEBUG_IID \ +#define NS_IDTDDEBUG_IID \ {0x7b68c220, 0x0685, 0x11d2, \ {0xa4, 0xb5, 0x00, 0x80, 0x5f, 0x2a, 0x0e, 0xd2}} @@ -38,7 +38,7 @@ class nsIDTD; class nsParser; -class nsIParserDebug : public nsISupports { +class nsIDTDDebug : public nsISupports { public: @@ -52,6 +52,6 @@ public: }; -extern NS_EXPORT nsresult NS_NewParserDebug(nsIParserDebug** aInstancePtrResult); +extern NS_EXPORT nsresult NS_NewDTDDebug(nsIDTDDebug** aInstancePtrResult); -#endif /* NS_IPARSERDEBUG__ */ \ No newline at end of file +#endif /* NS_IDTDDEBUG__ */ \ No newline at end of file diff --git a/mozilla/parser/htmlparser/src/nsIParser.h b/mozilla/parser/htmlparser/src/nsIParser.h index e2e394f2314..619bcd1b322 100644 --- a/mozilla/parser/htmlparser/src/nsIParser.h +++ b/mozilla/parser/htmlparser/src/nsIParser.h @@ -34,7 +34,7 @@ class nsString; class CToken; class nsIURL; class nsIDTD; -class nsIParserDebug; +class nsIDTDDebug; /** * This class defines the iparser interface. This XPCOM @@ -48,6 +48,7 @@ class nsIParser : public nsISupports { virtual nsIContentSink* SetContentSink(nsIContentSink* aContentSink)=0; virtual void SetDTD(nsIDTD* aDTD)=0; + virtual nsIDTD* GetDTD(void)=0; /** @@ -62,9 +63,9 @@ class nsIParser : public nsISupports { virtual PRInt32 Parse(nsIURL* aURL, nsIStreamListener* aListener, - nsIParserDebug * aDebug = 0) = 0; + nsIDTDDebug * aDTDDebug = 0) = 0; - virtual PRInt32 Parse(const char* aFilename,nsIParserDebug * aDebug = 0)=0; + virtual PRInt32 Parse(const char* aFilename)=0; virtual PRInt32 Parse(nsString& anHTMLString,PRBool appendTokens)=0; diff --git a/mozilla/parser/htmlparser/src/nsParser.cpp b/mozilla/parser/htmlparser/src/nsParser.cpp index ca45dcc4e1d..f0aeb744063 100644 --- a/mozilla/parser/htmlparser/src/nsParser.cpp +++ b/mozilla/parser/htmlparser/src/nsParser.cpp @@ -30,7 +30,7 @@ #include #include "nsIInputStream.h" #include "nsIParserFilter.h" -#include "nsIParserDebug.h" +#include "nsIDTDDebug.h" static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); static NS_DEFINE_IID(kClassIID, NS_PARSER_IID); @@ -86,8 +86,8 @@ CTokenDeallocator gTokenKiller; */ nsParser::nsParser() : mTokenDeque(gTokenKiller) { NS_INIT_REFCNT(); + mDTDDebug = 0; mParserFilter = 0; - mParserDebug = 0; mListener = 0; mTransferBuffer=0; mSink=0; @@ -108,6 +108,7 @@ nsParser::nsParser() : mTokenDeque(gTokenKiller) { */ nsParser::~nsParser() { NS_IF_RELEASE(mListener); + NS_IF_RELEASE(mDTDDebug); if(mTransferBuffer) delete [] mTransferBuffer; mTransferBuffer=0; @@ -120,7 +121,6 @@ nsParser::~nsParser() { mScanner=0; NS_IF_RELEASE(mDTD); - NS_IF_RELEASE(mParserDebug); NS_IF_RELEASE(mURL); } @@ -334,16 +334,17 @@ PRBool nsParser::DetermineContentType(const char* aContentType) { * @param * @return */ -PRInt32 nsParser::WillBuildModel(const char* aFilename, const char* aContentType, nsIParserDebug * aDebug){ +PRInt32 nsParser::WillBuildModel(const char* aFilename, const char* aContentType){ mMajorIteration=-1; mMinorIteration=-1; mParseMode=DetermineParseMode(); mDTD=(0==mDTD) ? CreateDTD(mParseMode,aContentType) : mDTD; if(mDTD) { + mDTD->SetDTDDebug(mDTDDebug); mDTD->SetParser(this); mDTD->SetContentSink(mSink); - mDTD->WillBuildModel(aFilename,mParserDebug); + mDTD->WillBuildModel(aFilename); } #ifdef DEBUG_SAVE_SOURCE_DOC @@ -394,20 +395,17 @@ PRInt32 nsParser::DidBuildModel(PRInt32 anErrorCode) { * @param aFilename -- const char* containing file to be parsed. * @return PR_TRUE if parse succeeded, PR_FALSE otherwise. */ -PRBool nsParser::Parse(const char* aFilename,nsIParserDebug* aParserDebug){ +PRBool nsParser::Parse(const char* aFilename){ NS_PRECONDITION(0!=aFilename,kNullFilename); PRInt32 status=kBadFilename; if(aFilename) { - mParserDebug = aParserDebug; - NS_IF_ADDREF(mParserDebug); - //ok, time to create our tokenizer and begin the process mScanner=new CScanner(aFilename,mParseMode); char theContentType[600]; DetermineContentType(theContentType); - WillBuildModel(aFilename,theContentType,aParserDebug); + WillBuildModel(aFilename,theContentType); status=ResumeParse(); DidBuildModel(status); @@ -429,14 +427,13 @@ PRBool nsParser::Parse(const char* aFilename,nsIParserDebug* aParserDebug){ * @param aFilename -- const char* containing file to be parsed. * @return PR_TRUE if parse succeeded, PR_FALSE otherwise. */ -PRInt32 nsParser::Parse(nsIURL* aURL,nsIStreamListener* aListener,nsIParserDebug* aParserDebug) { +PRInt32 nsParser::Parse(nsIURL* aURL,nsIStreamListener* aListener, nsIDTDDebug * aDTDDebug) { NS_PRECONDITION(0!=aURL,kNullURL); PRInt32 status=kBadURL; - NS_IF_RELEASE(mParserDebug); - mParserDebug = aParserDebug; - NS_IF_ADDREF(mParserDebug); + mDTDDebug = aDTDDebug; + NS_IF_ADDREF(mDTDDebug); NS_IF_RELEASE(mURL); mURL = aURL; @@ -594,7 +591,7 @@ nsresult nsParser::OnStartBinding(const char* aContentType){ if (nsnull != mListener) { mListener->OnStartBinding(aContentType); } - nsresult result=WillBuildModel(mURL->GetSpec(),aContentType,mParserDebug); + nsresult result=WillBuildModel(mURL->GetSpec(),aContentType); if(!mTransferBuffer) { mTransferBuffer=new char[gTransferBufferSize+1]; } diff --git a/mozilla/parser/htmlparser/src/nsParser.h b/mozilla/parser/htmlparser/src/nsParser.h index d46127dc875..e21e00052be 100644 --- a/mozilla/parser/htmlparser/src/nsParser.h +++ b/mozilla/parser/htmlparser/src/nsParser.h @@ -72,9 +72,9 @@ class IContentSink; class nsIHTMLContentSink; class nsIURL; class nsIDTD; +class nsIDTDDebug; class CScanner; class nsIParserFilter; -class nsIParserDebug; class nsParser : public nsIParser, public nsIStreamListener { @@ -129,8 +129,7 @@ friend class CTokenHandler; * @return TRUE if all went well -- FALSE otherwise */ virtual PRInt32 Parse(nsIURL* aURL, - nsIStreamListener* aListener, - nsIParserDebug * aDebug = 0); + nsIStreamListener* aListener, nsIDTDDebug * aDTDDebug = 0); /** * Cause parser to parse input from given file in given mode @@ -139,7 +138,7 @@ friend class CTokenHandler; * @param aMode is the desired parser mode (Nav, other, etc.) * @return TRUE if all went well -- FALSE otherwise */ - virtual PRInt32 Parse(const char* aFilename,nsIParserDebug * aDebug = 0); + virtual PRInt32 Parse(const char* aFilename); /** * @update gess5/11/98 @@ -205,7 +204,7 @@ protected: * @param * @return */ - PRInt32 WillBuildModel(const char* aFilename=0,const char* aContentType=0, nsIParserDebug* aDebug=0); + PRInt32 WillBuildModel(const char* aFilename=0,const char* aContentType=0); /** * @@ -324,8 +323,8 @@ protected: nsDeque mTokenDeque; CScanner* mScanner; - nsIParserDebug* mParserDebug; nsIURL* mURL; + nsIDTDDebug* mDTDDebug; }; diff --git a/mozilla/parser/htmlparser/src/nsParserDebug.cpp b/mozilla/parser/htmlparser/src/nsParserDebug.cpp deleted file mode 100644 index dfa20caa14e..00000000000 --- a/mozilla/parser/htmlparser/src/nsParserDebug.cpp +++ /dev/null @@ -1,535 +0,0 @@ -/* -*- 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 jevering 06/18/98 - * - * This file contains the parser debugger object which aids in - * walking links and reporting statistic information, reporting - * bad vectors. - */ - -#include "CNavDTD.h" -#include "nsHTMLTokens.h" -#include "nsParser.h" -#include "nsIParserDebug.h" -#include "nsCRT.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" -#include "prstrm.h" -#include -#include -#include "prmem.h" - -#define CONTEXT_VECTOR_MAP "/vector.map" -#define CONTEXT_VECTOR_STAT "/vector.stat" -#define VECTOR_TABLE_HEADER "count vector\r\n====== =============================================\r\n" - -// structure to store the vector statistic information - -typedef struct vector_info { - PRInt32 references; // number of occurances counted - PRInt32 count; // number of tags in the vector - PRBool good_vector; // is this a valid vector? - eHTMLTags* vector; // and the vector -} VectorInfo; - -// the statistic vector table grows each time it exceeds this -// stepping value -#define TABLE_SIZE 128 - -class CParserDebug : public nsIParserDebug { -public: - - CParserDebug(char * aVerifyDir = 0); - ~CParserDebug(); - - NS_DECL_ISUPPORTS - - void SetVerificationDirectory(char * verify_dir); - void SetRecordStatistics(PRBool bval); - PRBool Verify(nsIDTD * aDTD, nsParser * aParser, int ContextStackPos, eHTMLTags aContextStack[], char * aURLRef); - void DumpVectorRecord(void); - - // global table for storing vector statistics and the size - -private: - VectorInfo ** mVectorInfoArray; - PRInt32 mVectorCount; - char * mVerificationDir; - PRBool mRecordingStatistics; - - PRBool DebugRecord(char * path, char * pURLRef, char * filename); - void NoteVector(eHTMLTags aTags[],PRInt32 count, PRBool good_vector); - void MakeVectorString(char * vector_string, VectorInfo * pInfo); -}; - -static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); -static NS_DEFINE_IID(kIDebugParserIID, NS_IPARSERDEBUG_IID); - -/** - * This method is defined in nsIParser. It is used to - * cause the COM-like construction of an nsParser. - * - * @update jevering 3/25/98 - * @param nsIParser** ptr to newly instantiated parser - * @return NS_xxx error result - */ - -NS_EXPORT nsresult NS_NewParserDebug(nsIParserDebug** aInstancePtrResult) -{ - CParserDebug *it = new CParserDebug(); - - if (it == 0) { - return NS_ERROR_OUT_OF_MEMORY; - } - - return it->QueryInterface(kIDebugParserIID, (void **)aInstancePtrResult); -} - -CParserDebug::CParserDebug(char * aVerifyDir) -{ - NS_INIT_REFCNT(); - mVectorInfoArray = 0; - mVectorCount = 0; - if (aVerifyDir) - mVerificationDir = PL_strdup(aVerifyDir); - else { - char * pString = PR_GetEnv("VERIFY_PARSER"); - if (pString) - mVerificationDir = PL_strdup(pString); - else - mVerificationDir = 0; - } - mRecordingStatistics = PR_TRUE; -} - -CParserDebug::~CParserDebug() -{ - if (mVerificationDir) - PL_strfree(mVerificationDir); -} - -/** - * 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 CParserDebug::QueryInterface(const nsIID& aIID, void** aInstancePtr) -{ - if (NULL == aInstancePtr) { - return NS_ERROR_NULL_POINTER; - } - - if(aIID.Equals(kISupportsIID)) { //do IUnknown... - *aInstancePtr = (nsIParserDebug*)(this); - } - else if(aIID.Equals(kIDebugParserIID)) { //do IParserDebug base class... - *aInstancePtr = (nsIParserDebug*)(this); - } - else { - *aInstancePtr=0; - return NS_NOINTERFACE; - } - ((nsISupports*) *aInstancePtr)->AddRef(); - return NS_OK; -} - -NS_IMPL_ADDREF(CParserDebug) -NS_IMPL_RELEASE(CParserDebug) - -void CParserDebug::SetVerificationDirectory(char * verify_dir) -{ - if (mVerificationDir) { - PL_strfree(mVerificationDir); - mVerificationDir = 0; - } - mVerificationDir = PL_strdup(verify_dir); -} - -void CParserDebug::SetRecordStatistics(PRBool bval) -{ - mRecordingStatistics = bval; -} - -/** - * This debug method records an invalid context vector and it's - * associated context vector and URL in a simple flat file mapping which - * resides in the verification directory and is named context.map - * - * @update jevering 6/06/98 - * @param path is the directory structure indicating the bad context vector - * @param pURLRef is the associated URL - * @param filename to record mapping to if not already recorded - * @return TRUE if it is already record (dont rerecord) - */ - -PRBool CParserDebug::DebugRecord(char * path, char * pURLRef, char * filename) -{ - char recordPath[2048]; - PRIntn oflags = 0; - - // create the record file name from the verification director - // and the default name. - strcpy(recordPath,mVerificationDir); - strcat(recordPath,CONTEXT_VECTOR_MAP); - - // create the file exists, only open for read/write - // otherwise, create it - if(PR_Access(recordPath,PR_ACCESS_EXISTS) != PR_SUCCESS) - oflags = PR_CREATE_FILE; - oflags |= PR_RDWR; - - // open the record file - PRFileDesc * recordFile = PR_Open(recordPath,oflags,0); - - if (recordFile) { - - char * string = (char *)PR_Malloc(2048); - PRBool found = PR_FALSE; - - // vectors are stored on the format iof "URL vector filename" - // where the vector contains the verification path and - // the filename contains the debug source dump - sprintf(string,"%s %s %s\r\n", pURLRef, path, filename); - - // get the file size, read in the file and parse it line at - // a time to check to see if we have already recorded this - // occurance - - PRInt32 iSize = PR_Seek(recordFile,0,PR_SEEK_END); - if (iSize) { - - char * buffer = (char*)PR_Malloc(iSize); - char * stringbuf = (char*)PR_Calloc(sizeof(char*),2048); - if (buffer!=NULL && string!=NULL) { - PRInt32 ibufferpos, istringpos; - - // beginning of file for read - PR_Seek(recordFile,0,PR_SEEK_SET); - PR_Read(recordFile,buffer,iSize); - - // run through the file looking for a matching vector - for (ibufferpos = istringpos = 0; ibufferpos < iSize; ibufferpos++) - { - // compare string once we have hit the end of the line - if (buffer[ibufferpos] == '\r') { - stringbuf[istringpos] = '\0'; - istringpos = 0; - // skip newline and space - ibufferpos++; - - if (PL_strlen(stringbuf)) { - char * space; - // chop of the filename for compare - if ((space = PL_strrchr(stringbuf, ' '))!=NULL) - *space = '\0'; - - // we have already recorded this one, free up, and return - if (!PL_strncmp(string,stringbuf,PL_strlen(stringbuf))) { - PR_Free(buffer); - PR_Free(stringbuf); - PR_Free(string); - return PR_TRUE; - } - } - } - - // build up the compare string - else - stringbuf[istringpos++] = buffer[ibufferpos]; - } - - // throw away the record file data - PR_Free(buffer); - PR_Free(stringbuf); - } - } - - // if this bad vector was not recorded, add it to record file - - if (!found) { - PR_Seek(recordFile,0,PR_SEEK_END); - PR_Write(recordFile,string,PL_strlen(string)); - } - - PR_Close(recordFile); - PR_Free(string); - } - - // vector was not recorded - return PR_FALSE; -} - -/** - * compare function for quick sort. Compares references and - * sorts in decending order - */ - -static int compare( const void *arg1, const void *arg2 ) -{ - VectorInfo ** p1 = (VectorInfo**)arg1; - VectorInfo ** p2 = (VectorInfo**)arg2; - return (*p2)->references - (*p1)->references; -} - -/** - * This debug routines stores statistical information about a - * context vector. The context vector statistics are stored in - * a global array. The table is resorted each time it grows to - * aid in lookup speed. If a vector has already been noted, its - * reference count is bumped, otherwise it is added to the table - * - * @update jevering 6/11/98 - * @param aTags is the tag list (vector) - * @param count is the size of the vector - * @return - */ - -void CParserDebug::NoteVector(eHTMLTags aTags[],PRInt32 count, PRBool good_vector) -{ - // if the table doesn't exist, create it - if (!mVectorInfoArray) { - mVectorInfoArray = (VectorInfo**)PR_Calloc(TABLE_SIZE,sizeof(VectorInfo*)); - } - else { - // attempt to look up the vector - for (PRInt32 i = 0; i < mVectorCount; i++) - - // check the vector only if they are the same size, if they - // match then just return without doing further work - if (mVectorInfoArray[i]->count == count) - if (!memcmp(mVectorInfoArray[i]->vector, aTags, sizeof(eHTMLTags)*count)) { - - // bzzzt. and we have a winner.. bump the ref count - mVectorInfoArray[i]->references++; - return; - } - } - - // the context vector hasn't been noted, so allocate it and - // initialize it one.. add it to the table - VectorInfo * pVectorInfo = (VectorInfo*)PR_Malloc(sizeof(VectorInfo)); - pVectorInfo->references = 1; - pVectorInfo->count = count; - pVectorInfo->good_vector = good_vector; - pVectorInfo->vector = (eHTMLTags*)PR_Malloc(count*sizeof(eHTMLTags)); - memcpy(pVectorInfo->vector,aTags,sizeof(eHTMLTags)*count); - mVectorInfoArray[mVectorCount++] = pVectorInfo; - - // have we maxed out the table? grow it.. sort it.. love it. - if ((mVectorCount % TABLE_SIZE) == 0) { - mVectorInfoArray = (VectorInfo**)realloc( - mVectorInfoArray, - (sizeof(VectorInfo*)*((mVectorCount/TABLE_SIZE)+1)*TABLE_SIZE)); - if (mVectorCount) { - qsort((void*)mVectorInfoArray,(size_t)mVectorCount,sizeof(VectorInfo*),compare); - } - } -} - -void CParserDebug::MakeVectorString(char * vector_string, VectorInfo * pInfo) -{ - sprintf (vector_string, "%6d ", pInfo->references); - for (PRInt32 j = 0; j < pInfo->count; j++) { - PL_strcat(vector_string, "<"); - PL_strcat(vector_string, (const char *)GetTagName(pInfo->vector[j])); - PL_strcat(vector_string, ">"); - } - PL_strcat(vector_string,"\r\n"); -} - -/** - * This debug routine dumps out the vector statistics to a text - * file in the verification directory and defaults to the name - * "vector.stat". It contains all parsed context vectors and there - * occurance count sorted in decending order. - * - * @update jevering 6/11/98 - * @param - * @return - */ - -void CParserDebug::DumpVectorRecord(void) -{ - // do we have a table? - if (mVectorCount) { - - // hopefully, they wont exceed 1K. - char vector_string[1024]; - char path[1024]; - - path[0] = '\0'; - - // put in the verification directory.. else the root - if (mVerificationDir) - strcpy(path,mVerificationDir); - - strcat(path,CONTEXT_VECTOR_STAT); - - // open the stat file creaming any existing stat file - PRFileDesc * statisticFile = PR_Open(path,PR_CREATE_FILE|PR_RDWR,0); - if (statisticFile) { - - PRInt32 i; - PRofstream ps; - ps.attach(statisticFile); - - // oh what the heck, sort it again - if (mVectorCount) { - qsort((void*)mVectorInfoArray,(size_t)mVectorCount,sizeof(VectorInfo*),compare); - } - - // cute little header - sprintf(vector_string,"Context vector occurance results. Processed %d unique vectors.\r\n\r\n", mVectorCount); - ps << vector_string; - - ps << "Invalid context vector summary (see " CONTEXT_VECTOR_STAT ") for mapping.\r\n"; - ps << VECTOR_TABLE_HEADER; - - // dump out the bad vectors encountered - for (i = 0; i < mVectorCount; i++) { - if (!mVectorInfoArray[i]->good_vector) { - MakeVectorString(vector_string, mVectorInfoArray[i]); - ps << vector_string; - } - } - - ps << "\r\n\r\nValid context vector summary\r\n"; - ps << VECTOR_TABLE_HEADER; - - // take a big vector table dump (good vectors) - for (i = 0; i < mVectorCount; i++) { - if (mVectorInfoArray[i]->good_vector) { - MakeVectorString(vector_string, mVectorInfoArray[i]); - ps << vector_string; - } - // free em up. they mean nothing to me now (I'm such a user) - - if (mVectorInfoArray[i]->vector) - PR_Free(mVectorInfoArray[i]->vector); - PR_Free(mVectorInfoArray[i]); - } //for - PR_Close(statisticFile); - }//if - - // ok, we are done with the table, free it up as well - PR_Free(mVectorInfoArray); - mVectorInfoArray = 0; - mVectorCount = 0; - - } //if -} - - -/** - * This debug method allows us to determine whether or not - * we've seen (and can handle) the given context vector. - * - * @update gess4/22/98 - * @param tags is an array of eHTMLTags - * @param count represents the number of items in the tags array - * @param aDTD is the DTD we plan to ask for verification - * @return TRUE if we know how to handle it, else false - */ - -PRBool CParserDebug::Verify(nsIDTD * aDTD, nsParser * aParser, int aContextStackPos, eHTMLTags aContextStack[], char * aURLRef) -{ - PRBool result=PR_TRUE; - - //ok, now see if we understand this vector - - if(0!=mVerificationDir || mRecordingStatistics) { - - if(aDTD && aContextStackPos>1) { - for (int i = 0; i < aContextStackPos-1; i++) - if (!aDTD->CanContain(aContextStack[i],aContextStack[i+1])) { - result = PR_FALSE; - break; - } - } - } - - if (mRecordingStatistics) { - NoteVector(aContextStack,aContextStackPos,result); - } - - if(0!=mVerificationDir) { - char path[2048]; - strcpy(path,mVerificationDir); - - int i=0; - for(i=0;iDebugDumpSource(ps); - PR_Close(debugFile); - } - } - } - } - - return result; -}