зеркало из https://github.com/mozilla/pjs.git
Fixing bug 241328. Eliminating dead code, and making some classes use less memory on some 64-bit platforms. Also doing some general cleaning. r+sr=bzbarsky@mit.edu
This commit is contained in:
Родитель
d5ba2d6212
Коммит
eaa83af43e
|
@ -1,532 +0,0 @@
|
|||
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either of the GNU General Public License Version 2 or later (the "GPL"),
|
||||
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
/**
|
||||
* MODULE NOTES:
|
||||
* @update gess 4/1/98
|
||||
*
|
||||
* This file contains the declarations for all the HTML specific token types that
|
||||
* our DTD's understand. In fact, the same set of token types are used for XML.
|
||||
* Currently we have tokens for text, comments, start and end tags, entities,
|
||||
* attributes, style, script and skipped content. Whitespace and newlines also
|
||||
* have their own token types, but don't count on them to stay forever.
|
||||
*
|
||||
* If you're looking for the html tags, they're in a file called nsHTMLTag.h/cpp.
|
||||
*
|
||||
* Most of the token types have a similar API. They have methods to get the type
|
||||
* of token (GetTokenType); those that represent HTML tags also have a method to
|
||||
* get type tag type (GetTypeID). In addition, most have a method that causes the
|
||||
* token to help in the parsing process called (Consume). We've also thrown in a
|
||||
* few standard debugging methods as well.
|
||||
*/
|
||||
|
||||
#ifndef HTMLTOKENS_H
|
||||
#define HTMLTOKENS_H
|
||||
|
||||
#include "nsToken.h"
|
||||
#include "nsHTMLTags.h"
|
||||
#include "nsParserError.h"
|
||||
#include "nsString.h"
|
||||
#include "nsScannerString.h"
|
||||
|
||||
class nsScanner;
|
||||
|
||||
/*******************************************************************
|
||||
* This enum defines the set of token types that we currently support.
|
||||
*******************************************************************/
|
||||
|
||||
enum eHTMLTokenTypes {
|
||||
eToken_unknown=0,
|
||||
eToken_start=1, eToken_end, eToken_comment, eToken_entity,
|
||||
eToken_whitespace, eToken_newline, eToken_text, eToken_attribute,
|
||||
eToken_script, eToken_style, eToken_skippedcontent, eToken_instruction,
|
||||
eToken_cdatasection, eToken_error, eToken_doctypeDecl, eToken_markupDecl,
|
||||
eToken_last //make sure this stays the last token...
|
||||
};
|
||||
|
||||
enum eHTMLCategory {
|
||||
eHTMLCategory_unknown=0,
|
||||
eHTMLCategory_inline,
|
||||
eHTMLCategory_block,
|
||||
eHTMLCategory_blockAndInline,
|
||||
eHTMLCategory_list,
|
||||
eHTMLCategory_table,
|
||||
eHTMLCategory_tablepart,
|
||||
eHTMLCategory_tablerow,
|
||||
eHTMLCategory_tabledata,
|
||||
eHTMLCategory_head,
|
||||
eHTMLCategory_html,
|
||||
eHTMLCategory_body,
|
||||
eHTMLCategory_form,
|
||||
eHTMLCategory_options,
|
||||
eHTMLCategory_frameset,
|
||||
eHTMLCategory_text
|
||||
};
|
||||
|
||||
|
||||
nsresult ConsumeQuotedString(PRUnichar aChar,nsString& aString,nsScanner& aScanner);
|
||||
nsresult ConsumeAttributeText(PRUnichar aChar,nsString& aString,nsScanner& aScanner);
|
||||
const PRUnichar* GetTagName(PRInt32 aTag);
|
||||
//PRInt32 FindEntityIndex(nsString& aString,PRInt32 aCount=-1);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* This declares the basic token type used in the HTML DTD's.
|
||||
* @update gess 3/25/98
|
||||
*/
|
||||
class CHTMLToken : public CToken {
|
||||
public:
|
||||
virtual ~CHTMLToken();
|
||||
|
||||
CHTMLToken(eHTMLTags aTag);
|
||||
|
||||
virtual eContainerInfo GetContainerInfo(void) const {return eFormUnknown;}
|
||||
virtual void SetContainerInfo(eContainerInfo aInfo) { }
|
||||
|
||||
protected:
|
||||
};
|
||||
|
||||
/**
|
||||
* This declares start tokens, which always take the form <xxxx>.
|
||||
* This class also knows how to consume related attributes.
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
*/
|
||||
class CStartToken: public CHTMLToken {
|
||||
CTOKEN_IMPL_SIZEOF
|
||||
|
||||
public:
|
||||
CStartToken(eHTMLTags aTag=eHTMLTag_unknown);
|
||||
CStartToken(const nsAString& aString);
|
||||
CStartToken(const nsAString& aName,eHTMLTags aTag);
|
||||
|
||||
virtual nsresult Consume(PRUnichar aChar,nsScanner& aScanner,PRInt32 aMode);
|
||||
virtual PRInt32 GetTypeID(void);
|
||||
virtual const char* GetClassName(void);
|
||||
virtual PRInt32 GetTokenType(void);
|
||||
|
||||
virtual PRBool IsEmpty(void);
|
||||
virtual void SetEmpty(PRBool aValue);
|
||||
|
||||
virtual const nsAString& GetStringValue();
|
||||
virtual void GetSource(nsString& anOutputString);
|
||||
virtual void AppendSourceTo(nsAString& anOutputString);
|
||||
|
||||
//the following info is used to set well-formedness state on start tags...
|
||||
virtual eContainerInfo GetContainerInfo(void) const {return mContainerInfo;}
|
||||
virtual void SetContainerInfo(eContainerInfo aContainerInfo) {mContainerInfo=aContainerInfo;}
|
||||
virtual PRBool IsWellFormed(void) const {return PRBool(eWellFormed==mContainerInfo);}
|
||||
|
||||
|
||||
/*
|
||||
* Get and set the ID attribute atom for this element.
|
||||
* See http://www.w3.org/TR/1998/REC-xml-19980210#sec-attribute-types
|
||||
* for the definition of an ID attribute.
|
||||
*
|
||||
*/
|
||||
virtual nsresult GetIDAttributeAtom(nsIAtom** aResult);
|
||||
virtual nsresult SetIDAttributeAtom(nsIAtom* aID);
|
||||
|
||||
nsString mTextValue;
|
||||
nsString mTrailingContent;
|
||||
protected:
|
||||
eContainerInfo mContainerInfo;
|
||||
nsCOMPtr<nsIAtom> mIDAttributeAtom;
|
||||
PRPackedBool mEmpty;
|
||||
#ifdef DEBUG
|
||||
PRPackedBool mAttributed;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* This declares end tokens, which always take the
|
||||
* form </xxxx>. This class also knows how to consume
|
||||
* related attributes.
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
*/
|
||||
class CEndToken: public CHTMLToken {
|
||||
CTOKEN_IMPL_SIZEOF
|
||||
|
||||
public:
|
||||
CEndToken(eHTMLTags aTag);
|
||||
CEndToken(const nsAString& aString);
|
||||
CEndToken(const nsAString& aName,eHTMLTags aTag);
|
||||
virtual nsresult Consume(PRUnichar aChar,nsScanner& aScanner,PRInt32 aMode);
|
||||
virtual PRInt32 GetTypeID(void);
|
||||
virtual const char* GetClassName(void);
|
||||
virtual PRInt32 GetTokenType(void);
|
||||
|
||||
virtual const nsAString& GetStringValue();
|
||||
virtual void GetSource(nsString& anOutputString);
|
||||
virtual void AppendSourceTo(nsAString& anOutputString);
|
||||
|
||||
protected:
|
||||
nsString mTextValue;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* This declares comment tokens. Comments are usually
|
||||
* thought of as tokens, but we treat them that way
|
||||
* here so that the parser can have a consistent view
|
||||
* of all tokens.
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
*/
|
||||
class CCommentToken: public CHTMLToken {
|
||||
CTOKEN_IMPL_SIZEOF
|
||||
|
||||
public:
|
||||
CCommentToken();
|
||||
CCommentToken(const nsAString& aString);
|
||||
virtual nsresult Consume(PRUnichar aChar,nsScanner& aScanner,PRInt32 aMode);
|
||||
virtual const char* GetClassName(void);
|
||||
virtual PRInt32 GetTokenType(void);
|
||||
virtual const nsAString& GetStringValue(void);
|
||||
virtual void AppendSourceTo(nsAString& anOutputString);
|
||||
|
||||
nsresult ConsumeStrictComment(nsScanner& aScanner);
|
||||
nsresult ConsumeQuirksComment(nsScanner& aScanner);
|
||||
|
||||
protected:
|
||||
nsScannerSubstring mComment; // does not include MDO & MDC
|
||||
nsScannerSubstring mCommentDecl; // includes MDO & MDC
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* This class declares entity tokens, which always take
|
||||
* the form &xxxx;. This class also offers a few utility
|
||||
* methods that allow you to easily reduce entities.
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
*/
|
||||
class CEntityToken : public CHTMLToken {
|
||||
CTOKEN_IMPL_SIZEOF
|
||||
|
||||
public:
|
||||
CEntityToken();
|
||||
CEntityToken(const nsAString& aString);
|
||||
virtual const char* GetClassName(void);
|
||||
virtual PRInt32 GetTokenType(void);
|
||||
PRInt32 TranslateToUnicodeStr(nsString& aString);
|
||||
virtual nsresult Consume(PRUnichar aChar,nsScanner& aScanner,PRInt32 aMode);
|
||||
static nsresult ConsumeEntity(PRUnichar aChar,nsString& aString,nsScanner& aScanner);
|
||||
static PRInt32 TranslateToUnicodeStr(PRInt32 aValue,nsString& aString);
|
||||
|
||||
virtual const nsAString& GetStringValue(void);
|
||||
virtual void GetSource(nsString& anOutputString);
|
||||
virtual void AppendSourceTo(nsAString& anOutputString);
|
||||
|
||||
protected:
|
||||
nsString mTextValue;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Whitespace tokens are used where whitespace can be
|
||||
* detected as distinct from text. This allows us to
|
||||
* easily skip leading/trailing whitespace when desired.
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
*/
|
||||
class CWhitespaceToken: public CHTMLToken {
|
||||
CTOKEN_IMPL_SIZEOF
|
||||
|
||||
public:
|
||||
CWhitespaceToken();
|
||||
CWhitespaceToken(const nsAString& aString);
|
||||
virtual nsresult Consume(PRUnichar aChar,nsScanner& aScanner,PRInt32 aMode);
|
||||
virtual const char* GetClassName(void);
|
||||
virtual PRInt32 GetTokenType(void);
|
||||
virtual const nsAString& GetStringValue(void);
|
||||
|
||||
protected:
|
||||
nsString mTextValue;
|
||||
};
|
||||
|
||||
/**
|
||||
* Text tokens contain the normalized form of html text.
|
||||
* These tokens are guaranteed not to contain entities,
|
||||
* start or end tags, or newlines.
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
*/
|
||||
class CTextToken: public CHTMLToken {
|
||||
CTOKEN_IMPL_SIZEOF
|
||||
|
||||
public:
|
||||
CTextToken();
|
||||
CTextToken(const nsAString& aString);
|
||||
virtual nsresult Consume(PRUnichar aChar,nsScanner& aScanner,PRInt32 aMode);
|
||||
nsresult ConsumeUntil(PRUnichar aChar,PRBool aIgnoreComments,nsScanner& aScanner,
|
||||
nsString& aEndTagName,PRInt32 aFlag,PRBool& aFlushTokens);
|
||||
virtual const char* GetClassName(void);
|
||||
virtual PRInt32 GetTokenType(void);
|
||||
virtual PRInt32 GetTextLength(void);
|
||||
virtual void CopyTo(nsAString& aStr);
|
||||
virtual const nsAString& GetStringValue(void);
|
||||
virtual void Bind(nsScanner* aScanner, nsScannerIterator& aStart, nsScannerIterator& aEnd);
|
||||
virtual void Bind(const nsAString& aStr);
|
||||
|
||||
protected:
|
||||
nsScannerSubstring mTextValue;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* CDATASection tokens contain raw unescaped text content delimited by
|
||||
* a ![CDATA[ and ]].
|
||||
* XXX Not really a HTML construct - maybe we need a separation
|
||||
*
|
||||
* @update vidur 11/12/98
|
||||
*/
|
||||
class CCDATASectionToken : public CHTMLToken {
|
||||
CTOKEN_IMPL_SIZEOF
|
||||
|
||||
public:
|
||||
CCDATASectionToken(eHTMLTags aTag = eHTMLTag_unknown);
|
||||
CCDATASectionToken(const nsAString& aString);
|
||||
virtual nsresult Consume(PRUnichar aChar,nsScanner& aScanner,PRInt32 aMode);
|
||||
virtual const char* GetClassName(void);
|
||||
virtual PRInt32 GetTokenType(void);
|
||||
virtual const nsAString& GetStringValue(void);
|
||||
|
||||
protected:
|
||||
nsString mTextValue;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Declaration tokens contain raw unescaped text content (not really, but
|
||||
* right now we use this only for view source).
|
||||
* XXX Not really a HTML construct - maybe we need a separation
|
||||
*
|
||||
*/
|
||||
class CMarkupDeclToken : public CHTMLToken {
|
||||
CTOKEN_IMPL_SIZEOF
|
||||
|
||||
public:
|
||||
CMarkupDeclToken();
|
||||
CMarkupDeclToken(const nsAString& aString);
|
||||
virtual nsresult Consume(PRUnichar aChar,nsScanner& aScanner,PRInt32 aMode);
|
||||
virtual const char* GetClassName(void);
|
||||
virtual PRInt32 GetTokenType(void);
|
||||
virtual const nsAString& GetStringValue(void);
|
||||
|
||||
protected:
|
||||
nsScannerSubstring mTextValue;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Attribute tokens are used to contain attribute key/value
|
||||
* pairs whereever they may occur. Typically, they should
|
||||
* occur only in start tokens. However, we may expand that
|
||||
* ability when XML tokens become commonplace.
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
*/
|
||||
class CAttributeToken: public CHTMLToken {
|
||||
CTOKEN_IMPL_SIZEOF
|
||||
|
||||
public:
|
||||
CAttributeToken();
|
||||
CAttributeToken(const nsAString& aString);
|
||||
CAttributeToken(const nsAString& aKey, const nsAString& aString);
|
||||
~CAttributeToken() {}
|
||||
virtual nsresult Consume(PRUnichar aChar,nsScanner& aScanner,PRInt32 aMode);
|
||||
virtual const char* GetClassName(void);
|
||||
virtual PRInt32 GetTokenType(void);
|
||||
virtual const nsAString& GetKey(void); // XXX {return mTextKey;}
|
||||
virtual void SetKey(const nsAString& aKey);
|
||||
virtual void BindKey(nsScanner* aScanner, nsScannerIterator& aStart, nsScannerIterator& aEnd);
|
||||
virtual const nsAString& GetValue(void) {return mTextValue;}
|
||||
virtual void SanitizeKey();
|
||||
virtual const nsAString& GetStringValue(void);
|
||||
virtual void GetSource(nsString& anOutputString);
|
||||
virtual void AppendSourceTo(nsAString& anOutputString);
|
||||
|
||||
PRPackedBool mHasEqualWithoutValue;
|
||||
protected:
|
||||
#ifdef DEBUG
|
||||
PRPackedBool mLastAttribute;
|
||||
#endif
|
||||
nsAutoString mTextValue;
|
||||
nsScannerSubstring mTextKey;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Newline tokens contain, you guessed it, newlines.
|
||||
* They consume newline (CR/LF) either alone or in pairs.
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
*/
|
||||
class CNewlineToken: public CHTMLToken {
|
||||
CTOKEN_IMPL_SIZEOF
|
||||
|
||||
public:
|
||||
CNewlineToken();
|
||||
virtual nsresult Consume(PRUnichar aChar,nsScanner& aScanner,PRInt32 aMode);
|
||||
virtual const char* GetClassName(void);
|
||||
virtual PRInt32 GetTokenType(void);
|
||||
virtual const nsAString& GetStringValue(void);
|
||||
|
||||
static void AllocNewline();
|
||||
static void FreeNewline();
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Script tokens contain sequences of javascript (or, gulp,
|
||||
* any other script you care to send). We don't tokenize
|
||||
* it here, nor validate it. We just wrap it up, and pass
|
||||
* it along to the html parser, who sends it (later on)
|
||||
* to the scripting engine.
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
*/
|
||||
class CScriptToken: public CHTMLToken {
|
||||
CTOKEN_IMPL_SIZEOF
|
||||
|
||||
public:
|
||||
CScriptToken();
|
||||
CScriptToken(const nsAString& aString);
|
||||
virtual const char* GetClassName(void);
|
||||
virtual PRInt32 GetTokenType(void);
|
||||
virtual const nsAString& GetStringValue(void);
|
||||
|
||||
protected:
|
||||
nsString mTextValue;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Style tokens contain sequences of css style. We don't
|
||||
* tokenize it here, nor validate it. We just wrap it up,
|
||||
* and pass it along to the html parser, who sends it
|
||||
* (later on) to the style engine.
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
*/
|
||||
class CStyleToken: public CHTMLToken {
|
||||
CTOKEN_IMPL_SIZEOF
|
||||
|
||||
public:
|
||||
CStyleToken();
|
||||
CStyleToken(const nsAString& aString);
|
||||
virtual const char* GetClassName(void);
|
||||
virtual PRInt32 GetTokenType(void);
|
||||
virtual const nsAString& GetStringValue(void);
|
||||
|
||||
protected:
|
||||
nsString mTextValue;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Whitespace tokens are used where whitespace can be
|
||||
* detected as distinct from text. This allows us to
|
||||
* easily skip leading/trailing whitespace when desired.
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
*/
|
||||
class CInstructionToken: public CHTMLToken {
|
||||
CTOKEN_IMPL_SIZEOF
|
||||
|
||||
public:
|
||||
CInstructionToken();
|
||||
CInstructionToken(const nsAString& aString);
|
||||
virtual nsresult Consume(PRUnichar aChar,nsScanner& aScanner,PRInt32 aMode);
|
||||
virtual const char* GetClassName(void);
|
||||
virtual PRInt32 GetTokenType(void);
|
||||
virtual const nsAString& GetStringValue(void);
|
||||
|
||||
protected:
|
||||
nsString mTextValue;
|
||||
};
|
||||
|
||||
class CErrorToken : public CHTMLToken {
|
||||
CTOKEN_IMPL_SIZEOF
|
||||
|
||||
public:
|
||||
CErrorToken(nsParserError* aError=0);
|
||||
~CErrorToken();
|
||||
virtual const char* GetClassName(void);
|
||||
virtual PRInt32 GetTokenType(void);
|
||||
|
||||
void SetError(nsParserError* aError); // CErrorToken takes ownership of aError
|
||||
|
||||
// The nsParserError object returned by GetError is still owned by CErrorToken.
|
||||
// DO NOT use the delete operator on it. Should we change this so that a copy
|
||||
// of nsParserError is returned which needs to be destroyed by the consumer?
|
||||
const nsParserError* GetError(void);
|
||||
|
||||
virtual const nsAString& GetStringValue(void);
|
||||
protected:
|
||||
nsString mTextValue;
|
||||
nsParserError* mError;
|
||||
};
|
||||
|
||||
/**
|
||||
* This token is generated by the HTML and Expat tokenizers
|
||||
* when they see the doctype declaration ("<!DOCTYPE ... >")
|
||||
*
|
||||
*/
|
||||
|
||||
class CDoctypeDeclToken: public CHTMLToken {
|
||||
CTOKEN_IMPL_SIZEOF
|
||||
|
||||
public:
|
||||
CDoctypeDeclToken(eHTMLTags aTag=eHTMLTag_unknown);
|
||||
CDoctypeDeclToken(const nsAString& aString,eHTMLTags aTag=eHTMLTag_unknown);
|
||||
virtual nsresult Consume(PRUnichar aChar,nsScanner& aScanner,PRInt32 aMode);
|
||||
virtual const char* GetClassName(void);
|
||||
virtual PRInt32 GetTokenType(void);
|
||||
virtual const nsAString& GetStringValue(void);
|
||||
virtual void SetStringValue(const nsAString& aStr);
|
||||
|
||||
protected:
|
||||
nsString mTextValue;
|
||||
};
|
||||
|
||||
#endif
|
|
@ -1,303 +0,0 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either of the GNU General Public License Version 2 or later (the "GPL"),
|
||||
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
|
||||
/**
|
||||
* MODULE NOTES:
|
||||
* @update gess 4/1/98
|
||||
*
|
||||
* This class is defines the basic notion of a token
|
||||
* within our system. All other tokens are derived from
|
||||
* this one. It offers a few basic interfaces, but the
|
||||
* most important is consume(). The consume() method gets
|
||||
* called during the tokenization process when an instance
|
||||
* of that particular token type gets detected in the
|
||||
* input stream.
|
||||
*
|
||||
* CToken objects that are allocated from the heap _must_ be allocated
|
||||
* using the nsTokenAllocator: the nsTokenAllocator object uses an
|
||||
* arena to manage the tokens.
|
||||
*
|
||||
* The nsTokenAllocator object's arena implementation requires
|
||||
* object size at destruction time to properly recycle the object;
|
||||
* therefore, CToken::operator delete() is not public. Instead,
|
||||
* heap-allocated tokens should be destroyed using the static
|
||||
* Destroy() method, which accepts a token and the arena from which
|
||||
* the token was allocated.
|
||||
*
|
||||
* Leaf classes (that are actually instantiated from the heap) must
|
||||
* implement the SizeOf() method, which Destroy() uses to determine
|
||||
* the size of the token in order to properly recycle it.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef CTOKEN__
|
||||
#define CTOKEN__
|
||||
|
||||
#include "prtypes.h"
|
||||
#include "nsString.h"
|
||||
#include "nsError.h"
|
||||
#include "nsFixedSizeAllocator.h"
|
||||
|
||||
#define NS_HTMLTOKENS_NOT_AN_ENTITY \
|
||||
NS_ERROR_GENERATE_SUCCESS(NS_ERROR_MODULE_HTMLPARSER,2000)
|
||||
|
||||
class nsScanner;
|
||||
class nsTokenAllocator;
|
||||
|
||||
enum eContainerInfo {
|
||||
eWellFormed,
|
||||
eMalformed,
|
||||
eFormUnknown
|
||||
};
|
||||
|
||||
/**
|
||||
* Implement the SizeOf() method; leaf classes derived from CToken
|
||||
* must declare this.
|
||||
*/
|
||||
#define CTOKEN_IMPL_SIZEOF \
|
||||
protected: \
|
||||
virtual size_t SizeOf() const { return sizeof(*this); } \
|
||||
public:
|
||||
|
||||
/**
|
||||
* Token objects represent sequences of characters as they
|
||||
* are consumed from the input stream (URL). While they're
|
||||
* pretty general in nature, we use subclasses (found in
|
||||
* nsHTMLTokens.h) to define <start>, </end>, <text>,
|
||||
* <comment>, <&entity>, <newline>, and <whitespace> tokens.
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
*/
|
||||
class CToken {
|
||||
public:
|
||||
|
||||
enum eTokenOrigin {eSource,eResidualStyle};
|
||||
|
||||
protected:
|
||||
|
||||
// nsTokenAllocator should be the only class that tries to
|
||||
// allocate tokens from the heap.
|
||||
friend class nsTokenAllocator;
|
||||
|
||||
/**
|
||||
*
|
||||
* @update harishd 08/01/00
|
||||
* @param aSize -
|
||||
* @param aArena - Allocate memory from this pool.
|
||||
*/
|
||||
static void * operator new (size_t aSize,nsFixedSizeAllocator& anArena) CPP_THROW_NEW
|
||||
{
|
||||
return anArena.Alloc(aSize);
|
||||
}
|
||||
|
||||
/**
|
||||
* Hide operator delete; clients should use Destroy() instead.
|
||||
*/
|
||||
static void operator delete (void*,size_t) {}
|
||||
|
||||
public:
|
||||
/**
|
||||
* destructor
|
||||
* @update gess5/11/98
|
||||
*/
|
||||
virtual ~CToken();
|
||||
|
||||
/**
|
||||
* Destroy a token.
|
||||
*/
|
||||
static void Destroy(CToken* aToken,nsFixedSizeAllocator& aArenaPool)
|
||||
{
|
||||
size_t sz = aToken->SizeOf();
|
||||
aToken->~CToken();
|
||||
aArenaPool.Free(aToken, sz);
|
||||
}
|
||||
|
||||
/**
|
||||
* Make a note on number of times you have been referenced
|
||||
* @update harishd 08/02/00
|
||||
*/
|
||||
void AddRef() { ++mUseCount; }
|
||||
|
||||
/**
|
||||
* Free yourself if no one is holding you.
|
||||
* @update harishd 08/02/00
|
||||
*/
|
||||
void Release(nsFixedSizeAllocator& aArenaPool) {
|
||||
if(--mUseCount==0)
|
||||
Destroy(this, aArenaPool);
|
||||
}
|
||||
|
||||
/**
|
||||
* Default constructor
|
||||
* @update gess7/21/98
|
||||
*/
|
||||
CToken(PRInt32 aTag=0);
|
||||
|
||||
/**
|
||||
* Retrieve string value of the token
|
||||
* @update gess5/11/98
|
||||
* @return reference to string containing string value
|
||||
*/
|
||||
virtual const nsAString& GetStringValue(void) = 0;
|
||||
|
||||
/**
|
||||
* Get string of full contents, suitable for debug dump.
|
||||
* It should look exactly like the input source.
|
||||
* @update gess5/11/98
|
||||
* @return reference to string containing string value
|
||||
*/
|
||||
virtual void GetSource(nsString& anOutputString);
|
||||
|
||||
/** @update harishd 03/23/00
|
||||
* @return reference to string containing string value
|
||||
*/
|
||||
virtual void AppendSourceTo(nsAString& anOutputString);
|
||||
|
||||
/**
|
||||
* Sets the ordinal value of this token (not currently used)
|
||||
* @update gess5/11/98
|
||||
* @param value is the new ord value for this token
|
||||
*/
|
||||
virtual void SetTypeID(PRInt32 aValue);
|
||||
|
||||
/**
|
||||
* Getter which retrieves the current ordinal value for this token
|
||||
* @update gess5/11/98
|
||||
* @return current ordinal value
|
||||
*/
|
||||
virtual PRInt32 GetTypeID(void);
|
||||
|
||||
/**
|
||||
* Getter which retrieves the current attribute count for this token
|
||||
* @update gess5/11/98
|
||||
* @return current attribute count
|
||||
*/
|
||||
virtual PRInt16 GetAttributeCount(void);
|
||||
|
||||
/**
|
||||
* Causes token to consume data from given scanner.
|
||||
* Note that behavior varies wildly between CToken subclasses.
|
||||
* @update gess5/11/98
|
||||
* @param aChar -- most recent char consumed
|
||||
* @param aScanner -- input source where token should get data
|
||||
* @return error code (0 means ok)
|
||||
*/
|
||||
virtual nsresult Consume(PRUnichar aChar,nsScanner& aScanner,PRInt32 aMode);
|
||||
|
||||
/**
|
||||
* Getter which retrieves type of token
|
||||
* @update gess5/11/98
|
||||
* @return int containing token type
|
||||
*/
|
||||
virtual PRInt32 GetTokenType(void);
|
||||
|
||||
/**
|
||||
* Getter which retrieves the class name for this token
|
||||
* This method is only used for debug purposes.
|
||||
* @update gess5/11/98
|
||||
* @return const char* containing class name
|
||||
*/
|
||||
virtual const char* GetClassName(void);
|
||||
|
||||
|
||||
/**
|
||||
* For tokens who care, this can tell us whether the token is
|
||||
* well formed or not.
|
||||
*
|
||||
* @update gess 8/30/00
|
||||
* @return PR_FALSE; subclasses MUST override if they care.
|
||||
*/
|
||||
virtual PRBool IsWellFormed(void) const {return PR_FALSE;}
|
||||
|
||||
virtual PRBool IsEmpty(void) { return PR_FALSE; }
|
||||
|
||||
/**
|
||||
* If aValue is TRUE then the token represents a short-hand tag
|
||||
*/
|
||||
virtual void SetEmpty(PRBool aValue) { return ; }
|
||||
|
||||
PRInt32 GetNewlineCount()
|
||||
{
|
||||
return mNewlineCount;
|
||||
}
|
||||
|
||||
void SetNewlineCount(PRInt32 aCount)
|
||||
{
|
||||
mNewlineCount = aCount;
|
||||
}
|
||||
|
||||
PRInt32 GetLineNumber()
|
||||
{
|
||||
return mLineNumber;
|
||||
}
|
||||
|
||||
void SetLineNumber(PRInt32 aLineNumber)
|
||||
{
|
||||
mLineNumber = mLineNumber == 0 ? aLineNumber : mLineNumber;
|
||||
}
|
||||
|
||||
void SetAttributeCount(PRInt16 aValue) { mAttrCount = aValue; }
|
||||
|
||||
/**
|
||||
* perform self test.
|
||||
* @update gess5/11/98
|
||||
*/
|
||||
virtual void SelfTest(void);
|
||||
|
||||
static int GetTokenCount();
|
||||
|
||||
|
||||
|
||||
protected:
|
||||
/**
|
||||
* Returns the size of the token object.
|
||||
*/
|
||||
virtual size_t SizeOf() const = 0;
|
||||
|
||||
PRInt32 mTypeID;
|
||||
PRInt32 mUseCount;
|
||||
PRInt32 mNewlineCount;
|
||||
PRInt32 mLineNumber;
|
||||
PRInt16 mAttrCount;
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
|
@ -115,25 +115,6 @@ CStartToken::CStartToken(const nsAString& aName,eHTMLTags aTag) : CHTMLToken(aTa
|
|||
#endif
|
||||
}
|
||||
|
||||
nsresult CStartToken::GetIDAttributeAtom(nsIAtom** aResult)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aResult);
|
||||
*aResult = mIDAttributeAtom;
|
||||
NS_IF_ADDREF(*aResult);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
nsresult CStartToken::SetIDAttributeAtom(nsIAtom* aID)
|
||||
{
|
||||
NS_ENSURE_ARG(aID);
|
||||
mIDAttributeAtom = aID;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* This method returns the typeid (the tag type) for this token.
|
||||
*
|
||||
|
@ -148,17 +129,6 @@ PRInt32 CStartToken::GetTypeID(){
|
|||
return mTypeID;
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @param
|
||||
* @return
|
||||
*/
|
||||
const char* CStartToken::GetClassName(void) {
|
||||
return "start";
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
*
|
||||
|
@ -365,17 +335,6 @@ PRInt32 CEndToken::GetTypeID(){
|
|||
return mTypeID;
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @param
|
||||
* @return
|
||||
*/
|
||||
const char* CEndToken::GetClassName(void) {
|
||||
return "/end";
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
*
|
||||
|
@ -447,17 +406,6 @@ CTextToken::CTextToken(const nsAString& aName) : CHTMLToken(eHTMLTag_text) {
|
|||
mTextValue.Rebind(aName);
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @param
|
||||
* @return
|
||||
*/
|
||||
const char* CTextToken::GetClassName(void) {
|
||||
return "text";
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
*
|
||||
|
@ -715,17 +663,6 @@ CCDATASectionToken::CCDATASectionToken(const nsAString& aName) : CHTMLToken(eHTM
|
|||
mTextValue.Assign(aName);
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
*
|
||||
* @update vidur 11/12/98
|
||||
* @param
|
||||
* @return
|
||||
*/
|
||||
const char* CCDATASectionToken::GetClassName(void) {
|
||||
return "cdatasection";
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
* @update vidur 11/12/98
|
||||
|
@ -843,15 +780,6 @@ CMarkupDeclToken::CMarkupDeclToken(const nsAString& aName) : CHTMLToken(eHTMLTag
|
|||
mTextValue.Rebind(aName);
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
*
|
||||
* @param
|
||||
* @return
|
||||
*/
|
||||
const char* CMarkupDeclToken::GetClassName(void) {
|
||||
return "markupdeclaration";
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
|
@ -1255,17 +1183,6 @@ const nsAString& CCommentToken::GetStringValue(void)
|
|||
return mComment.AsString();
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @param
|
||||
* @return
|
||||
*/
|
||||
const char* CCommentToken::GetClassName(void){
|
||||
return "/**/";
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
*
|
||||
|
@ -1287,18 +1204,6 @@ PRInt32 CCommentToken::GetTokenType(void) {
|
|||
CNewlineToken::CNewlineToken() : CHTMLToken(eHTMLTag_newline) {
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
*
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @param
|
||||
* @return
|
||||
*/
|
||||
const char* CNewlineToken::GetClassName(void) {
|
||||
return "crlf";
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
*
|
||||
|
@ -1426,17 +1331,6 @@ CAttributeToken::CAttributeToken(const nsAString& aKey, const nsAString& aName)
|
|||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @param
|
||||
* @return
|
||||
*/
|
||||
const char* CAttributeToken::GetClassName(void) {
|
||||
return "attr";
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
*
|
||||
|
@ -1880,17 +1774,6 @@ CWhitespaceToken::CWhitespaceToken(const nsAString& aName) : CHTMLToken(eHTMLTag
|
|||
mTextValue.Assign(aName);
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @param
|
||||
* @return
|
||||
*/
|
||||
const char* CWhitespaceToken::GetClassName(void) {
|
||||
return "ws";
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
*
|
||||
|
@ -1965,18 +1848,6 @@ nsresult CEntityToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 aFla
|
|||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @param
|
||||
* @return
|
||||
*/
|
||||
const char* CEntityToken::GetClassName(void) {
|
||||
return "&entity";
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
*
|
||||
*
|
||||
|
@ -2245,18 +2116,6 @@ CScriptToken::CScriptToken(const nsAString& aString) : CHTMLToken(eHTMLTag_scrip
|
|||
mTextValue.Assign(aString);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
*
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @param
|
||||
* @return
|
||||
*/
|
||||
const char* CScriptToken::GetClassName(void) {
|
||||
return "script";
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
*
|
||||
|
@ -2287,17 +2146,6 @@ CStyleToken::CStyleToken(const nsAString& aString) : CHTMLToken(eHTMLTag_style)
|
|||
mTextValue.Assign(aString);
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @param
|
||||
* @return
|
||||
*/
|
||||
const char* CStyleToken::GetClassName(void) {
|
||||
return "style";
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
*
|
||||
|
@ -2370,17 +2218,6 @@ nsresult CInstructionToken::Consume(PRUnichar aChar,nsScanner& aScanner,PRInt32
|
|||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @update gess 9/23/98
|
||||
* @param
|
||||
* @return
|
||||
*/
|
||||
const char* CInstructionToken::GetClassName(void){
|
||||
return "instruction";
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
|
@ -2412,10 +2249,6 @@ PRInt32 CErrorToken::GetTokenType(void){
|
|||
return eToken_error;
|
||||
}
|
||||
|
||||
const char* CErrorToken::GetClassName(void){
|
||||
return "error";
|
||||
}
|
||||
|
||||
void CErrorToken::SetError(nsParserError *aError) {
|
||||
mError = aError;
|
||||
}
|
||||
|
@ -2488,10 +2321,6 @@ nsresult CDoctypeDeclToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32
|
|||
return result;
|
||||
}
|
||||
|
||||
const char* CDoctypeDeclToken::GetClassName(void) {
|
||||
return "doctype";
|
||||
}
|
||||
|
||||
PRInt32 CDoctypeDeclToken::GetTokenType(void) {
|
||||
return eToken_doctypeDecl;
|
||||
}
|
||||
|
|
|
@ -1,391 +0,0 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either of the GNU General Public License Version 2 or later (the "GPL"),
|
||||
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
|
||||
#include "nsIAtom.h"
|
||||
#include "nsParserNode.h"
|
||||
#include <string.h>
|
||||
#include "nsHTMLTokens.h"
|
||||
#include "nsITokenizer.h"
|
||||
#include "nsDTDUtils.h"
|
||||
|
||||
|
||||
/**
|
||||
* Default Constructor
|
||||
*/
|
||||
nsCParserNode::nsCParserNode()
|
||||
: mToken(nsnull),
|
||||
mUseCount(0),
|
||||
mGenericState(PR_FALSE),
|
||||
mTokenAllocator(nsnull)
|
||||
{
|
||||
MOZ_COUNT_CTOR(nsCParserNode);
|
||||
#ifdef HEAP_ALLOCATED_NODES
|
||||
mNodeAllocator = nsnull;
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @param aToken -- token to init internal token
|
||||
* @return
|
||||
*/
|
||||
nsCParserNode::nsCParserNode(CToken* aToken,
|
||||
nsTokenAllocator* aTokenAllocator,
|
||||
nsNodeAllocator* aNodeAllocator): nsIParserNode()
|
||||
{
|
||||
mRefCnt = 0;
|
||||
MOZ_COUNT_CTOR(nsCParserNode);
|
||||
|
||||
static int theNodeCount = 0;
|
||||
++theNodeCount;
|
||||
mToken = aToken;
|
||||
IF_HOLD(mToken);
|
||||
mTokenAllocator = aTokenAllocator;
|
||||
mUseCount = 0;
|
||||
mGenericState = PR_FALSE;
|
||||
#ifdef HEAP_ALLOCATED_NODES
|
||||
mNodeAllocator = aNodeAllocator;
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* default destructor
|
||||
* NOTE: We intentionally DONT recycle mToken here.
|
||||
* It may get cached for use elsewhere
|
||||
* @update gess 3/25/98
|
||||
* @param
|
||||
* @return
|
||||
*/
|
||||
nsCParserNode::~nsCParserNode() {
|
||||
MOZ_COUNT_DTOR(nsCParserNode);
|
||||
ReleaseAll();
|
||||
#ifdef HEAP_ALLOCATED_NODES
|
||||
if(mNodeAllocator) {
|
||||
mNodeAllocator->Recycle(this);
|
||||
}
|
||||
mNodeAllocator = nsnull;
|
||||
#endif
|
||||
mTokenAllocator = 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Init
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @param
|
||||
* @return
|
||||
*/
|
||||
|
||||
nsresult
|
||||
nsCParserNode::Init(CToken* aToken,
|
||||
nsTokenAllocator* aTokenAllocator,
|
||||
nsNodeAllocator* aNodeAllocator)
|
||||
{
|
||||
mTokenAllocator = aTokenAllocator;
|
||||
mToken = aToken;
|
||||
IF_HOLD(mToken);
|
||||
mGenericState = PR_FALSE;
|
||||
mUseCount=0;
|
||||
#ifdef HEAP_ALLOCATED_NODES
|
||||
mNodeAllocator = aNodeAllocator;
|
||||
#endif
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
void
|
||||
nsCParserNode::AddAttribute(CToken* aToken)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets the name of this node. Currently unused.
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @param
|
||||
* @return string ref containing node name
|
||||
*/
|
||||
const nsAString&
|
||||
nsCParserNode::GetTagName() const {
|
||||
return EmptyString();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get text value of this node, which translates into
|
||||
* getting the text value of the underlying token
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @param
|
||||
* @return string ref of text from internal token
|
||||
*/
|
||||
const nsAString&
|
||||
nsCParserNode::GetText() const
|
||||
{
|
||||
if (mToken) {
|
||||
return mToken->GetStringValue();
|
||||
}
|
||||
return EmptyString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get node type, meaning, get the tag type of the
|
||||
* underlying token
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @param
|
||||
* @return int value that represents tag type
|
||||
*/
|
||||
PRInt32
|
||||
nsCParserNode::GetNodeType(void) const
|
||||
{
|
||||
return (mToken) ? mToken->GetTypeID() : 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets the token type, which corresponds to a value from
|
||||
* eHTMLTokens_xxx.
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @param
|
||||
* @return
|
||||
*/
|
||||
PRInt32
|
||||
nsCParserNode::GetTokenType(void) const
|
||||
{
|
||||
return (mToken) ? mToken->GetTokenType() : 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Retrieve the number of attributes on this node
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @param
|
||||
* @return int -- representing attribute count
|
||||
*/
|
||||
PRInt32
|
||||
nsCParserNode::GetAttributeCount(PRBool askToken) const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the string rep of the attribute key at the
|
||||
* given index.
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @param anIndex-- offset of attribute to retrieve
|
||||
* @return string rep of given attribute text key
|
||||
*/
|
||||
const nsAString&
|
||||
nsCParserNode::GetKeyAt(PRUint32 anIndex) const
|
||||
{
|
||||
return EmptyString();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Retrieve the string rep of the attribute at given offset
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @param anIndex-- offset of attribute to retrieve
|
||||
* @return string rep of given attribute text value
|
||||
*/
|
||||
const nsAString&
|
||||
nsCParserNode::GetValueAt(PRUint32 anIndex) const
|
||||
{
|
||||
return EmptyString();
|
||||
}
|
||||
|
||||
PRInt32
|
||||
nsCParserNode::TranslateToUnicodeStr(nsString& aString) const
|
||||
{
|
||||
if (eToken_entity == mToken->GetTokenType()) {
|
||||
return ((CEntityToken*)mToken)->TranslateToUnicodeStr(aString);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* This getter retrieves the line number from the input source where
|
||||
* the token occured. Lines are interpreted as occuring between \n characters.
|
||||
* @update gess7/24/98
|
||||
* @return int containing the line number the token was found on
|
||||
*/
|
||||
PRInt32
|
||||
nsCParserNode::GetSourceLineNumber(void) const {
|
||||
return mToken ? mToken->GetLineNumber() : 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method pop the attribute token
|
||||
* @update harishd 03/25/99
|
||||
* @return token at anIndex
|
||||
*/
|
||||
|
||||
CToken*
|
||||
nsCParserNode::PopAttributeToken() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** Retrieve a string containing the tag and its attributes in "source" form
|
||||
* @update rickg 06June2000
|
||||
* @return void
|
||||
*/
|
||||
void
|
||||
nsCParserNode::GetSource(nsString& aString)
|
||||
{
|
||||
eHTMLTags theTag = mToken ? (eHTMLTags)mToken->GetTypeID() : eHTMLTag_unknown;
|
||||
aString.Assign(PRUnichar('<'));
|
||||
const PRUnichar* theTagName = nsHTMLTags::GetStringValue(theTag);
|
||||
if(theTagName) {
|
||||
aString.Append(theTagName);
|
||||
}
|
||||
aString.Append(PRUnichar('>'));
|
||||
}
|
||||
|
||||
/** Release all the objects you're holding to.
|
||||
* @update harishd 08/02/00
|
||||
* @return void
|
||||
*/
|
||||
nsresult
|
||||
nsCParserNode::ReleaseAll()
|
||||
{
|
||||
if(mTokenAllocator) {
|
||||
IF_FREE(mToken,mTokenAllocator);
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsCParserStartNode::Init(CToken* aToken,
|
||||
nsTokenAllocator* aTokenAllocator,
|
||||
nsNodeAllocator* aNodeAllocator)
|
||||
{
|
||||
NS_ASSERTION(mAttributes.GetSize() == 0, "attributes not recycled!");
|
||||
return nsCParserNode::Init(aToken, aTokenAllocator, aNodeAllocator);
|
||||
}
|
||||
|
||||
void nsCParserStartNode::AddAttribute(CToken* aToken)
|
||||
{
|
||||
NS_ASSERTION(0 != aToken, "Error: Token shouldn't be null!");
|
||||
mAttributes.Push(aToken);
|
||||
}
|
||||
|
||||
PRInt32
|
||||
nsCParserStartNode::GetAttributeCount(PRBool askToken) const
|
||||
{
|
||||
PRInt32 result = 0;
|
||||
if (askToken) {
|
||||
result = mToken ? mToken->GetAttributeCount() : 0;
|
||||
}
|
||||
else {
|
||||
result = mAttributes.GetSize();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
const nsAString&
|
||||
nsCParserStartNode::GetKeyAt(PRUint32 anIndex) const
|
||||
{
|
||||
if ((PRInt32)anIndex < mAttributes.GetSize()) {
|
||||
CAttributeToken* attr =
|
||||
NS_STATIC_CAST(CAttributeToken*, mAttributes.ObjectAt(anIndex));
|
||||
if (attr) {
|
||||
return attr->GetKey();
|
||||
}
|
||||
}
|
||||
return EmptyString();
|
||||
}
|
||||
|
||||
const nsAString&
|
||||
nsCParserStartNode::GetValueAt(PRUint32 anIndex) const
|
||||
{
|
||||
if (PRInt32(anIndex) < mAttributes.GetSize()) {
|
||||
CAttributeToken* attr =
|
||||
NS_STATIC_CAST(CAttributeToken*, mAttributes.ObjectAt(anIndex));
|
||||
if (attr) {
|
||||
return attr->GetValue();
|
||||
}
|
||||
}
|
||||
return EmptyString();
|
||||
}
|
||||
|
||||
CToken*
|
||||
nsCParserStartNode::PopAttributeToken()
|
||||
{
|
||||
return NS_STATIC_CAST(CToken*, mAttributes.Pop());
|
||||
}
|
||||
|
||||
void nsCParserStartNode::GetSource(nsString& aString)
|
||||
{
|
||||
aString.Assign(PRUnichar('<'));
|
||||
const PRUnichar* theTagName =
|
||||
nsHTMLTags::GetStringValue(nsHTMLTag(mToken->GetTypeID()));
|
||||
if (theTagName) {
|
||||
aString.Append(theTagName);
|
||||
}
|
||||
PRInt32 index;
|
||||
PRInt32 size = mAttributes.GetSize();
|
||||
for (index = 0 ; index < size; ++index) {
|
||||
CAttributeToken *theToken =
|
||||
NS_STATIC_CAST(CAttributeToken*, mAttributes.ObjectAt(index));
|
||||
if (theToken) {
|
||||
theToken->AppendSourceTo(aString);
|
||||
aString.Append(PRUnichar(' ')); //this will get removed...
|
||||
}
|
||||
}
|
||||
aString.Append(PRUnichar('>'));
|
||||
}
|
||||
|
||||
nsresult nsCParserStartNode::ReleaseAll()
|
||||
{
|
||||
NS_ASSERTION(0!=mTokenAllocator, "Error: no token allocator");
|
||||
CToken* theAttrToken;
|
||||
while ((theAttrToken = NS_STATIC_CAST(CToken*, mAttributes.Pop()))) {
|
||||
IF_FREE(theAttrToken, mTokenAllocator);
|
||||
}
|
||||
nsCParserNode::ReleaseAll();
|
||||
return NS_OK;
|
||||
}
|
||||
|
|
@ -1,321 +0,0 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either of the GNU General Public License Version 2 or later (the "GPL"),
|
||||
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
|
||||
/**
|
||||
* MODULE NOTES:
|
||||
* @update gess 4/1/98
|
||||
*
|
||||
* This class is defines the basic interface between the
|
||||
* parser and the content sink. The parser will iterate
|
||||
* over the collection of tokens that it sees from the
|
||||
* tokenizer, coverting each related "group" into one of
|
||||
* these. This object gets passed to the sink, and is
|
||||
* then immediately reused.
|
||||
*
|
||||
* If you want to hang onto one of these, you should
|
||||
* make your own copy.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef NS_PARSERNODE__
|
||||
#define NS_PARSERNODE__
|
||||
|
||||
#include "nsIParserNode.h"
|
||||
#include "nsToken.h"
|
||||
#include "nsString.h"
|
||||
#include "nsParserCIID.h"
|
||||
#include "nsDeque.h"
|
||||
#include "nsDTDUtils.h"
|
||||
|
||||
class nsTokenAllocator;
|
||||
|
||||
class nsCParserNode : public nsIParserNode {
|
||||
|
||||
protected:
|
||||
|
||||
PRInt32 mRefCnt;
|
||||
|
||||
public:
|
||||
|
||||
void AddRef()
|
||||
{
|
||||
++mRefCnt;
|
||||
}
|
||||
|
||||
void Release(nsFixedSizeAllocator& aPool)
|
||||
{
|
||||
if (--mRefCnt == 0)
|
||||
Destroy(this, aPool);
|
||||
}
|
||||
|
||||
#ifndef HEAP_ALLOCATED_NODES
|
||||
protected:
|
||||
|
||||
/**
|
||||
* Hide operator new; clients should use Create() instead.
|
||||
*/
|
||||
static void* operator new(size_t) CPP_THROW_NEW { return 0; }
|
||||
|
||||
/**
|
||||
* Hide operator delete; clients should use Destroy() instead.
|
||||
*/
|
||||
static void operator delete(void*,size_t) {}
|
||||
|
||||
#endif
|
||||
|
||||
public:
|
||||
static nsCParserNode* Create(CToken* aToken,
|
||||
nsTokenAllocator* aTokenAllocator,
|
||||
nsNodeAllocator* aNodeAllocator)
|
||||
{
|
||||
#ifdef HEAP_ALLOCATED_NODES
|
||||
return new
|
||||
#else
|
||||
nsFixedSizeAllocator& pool = aNodeAllocator->GetArenaPool();
|
||||
void* place = pool.Alloc(sizeof(nsCParserNode));
|
||||
return ::new (place)
|
||||
#endif
|
||||
nsCParserNode(aToken, aTokenAllocator, aNodeAllocator);
|
||||
}
|
||||
|
||||
static void Destroy(nsCParserNode* aNode, nsFixedSizeAllocator& aPool)
|
||||
{
|
||||
#ifdef HEAP_ALLOCATED_NODES
|
||||
delete aNode;
|
||||
#else
|
||||
aNode->~nsCParserNode();
|
||||
aPool.Free(aNode, sizeof(*aNode));
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* Default constructor
|
||||
*/
|
||||
nsCParserNode();
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
* @update gess5/11/98
|
||||
* @param aToken is the token this node "refers" to
|
||||
*/
|
||||
nsCParserNode(CToken* aToken,
|
||||
nsTokenAllocator* aTokenAllocator,
|
||||
nsNodeAllocator* aNodeAllocator=0);
|
||||
|
||||
/**
|
||||
* Destructor
|
||||
* @update gess5/11/98
|
||||
*/
|
||||
virtual ~nsCParserNode();
|
||||
|
||||
/**
|
||||
* Init
|
||||
* @update gess5/11/98
|
||||
*/
|
||||
virtual nsresult Init(CToken* aToken,
|
||||
nsTokenAllocator* aTokenAllocator,
|
||||
nsNodeAllocator* aNodeAllocator=0);
|
||||
|
||||
/**
|
||||
* Retrieve the name of the node
|
||||
* @update gess5/11/98
|
||||
* @return string containing node name
|
||||
*/
|
||||
virtual const nsAString& GetTagName() const;
|
||||
|
||||
/**
|
||||
* Retrieve the text from the given node
|
||||
* @update gess5/11/98
|
||||
* @return string containing node text
|
||||
*/
|
||||
virtual const nsAString& GetText() const;
|
||||
|
||||
/**
|
||||
* Retrieve the type of the parser node.
|
||||
* @update gess5/11/98
|
||||
* @return node type.
|
||||
*/
|
||||
virtual PRInt32 GetNodeType() const;
|
||||
|
||||
/**
|
||||
* Retrieve token type of parser node
|
||||
* @update gess5/11/98
|
||||
* @return token type
|
||||
*/
|
||||
virtual PRInt32 GetTokenType() const;
|
||||
|
||||
|
||||
//***************************************
|
||||
//methods for accessing key/value pairs
|
||||
//***************************************
|
||||
|
||||
/**
|
||||
* Retrieve the number of attributes in this node.
|
||||
* @update gess5/11/98
|
||||
* @return count of attributes (may be 0)
|
||||
*/
|
||||
virtual PRInt32 GetAttributeCount(PRBool askToken=PR_FALSE) const;
|
||||
|
||||
/**
|
||||
* Retrieve the key (of key/value pair) at given index
|
||||
* @update gess5/11/98
|
||||
* @param anIndex is the index of the key you want
|
||||
* @return string containing key.
|
||||
*/
|
||||
virtual const nsAString& GetKeyAt(PRUint32 anIndex) const;
|
||||
|
||||
/**
|
||||
* Retrieve the value (of key/value pair) at given index
|
||||
* @update gess5/11/98
|
||||
* @param anIndex is the index of the value you want
|
||||
* @return string containing value.
|
||||
*/
|
||||
virtual const nsAString& GetValueAt(PRUint32 anIndex) const;
|
||||
|
||||
/**
|
||||
* NOTE: When the node is an entity, this will translate the entity
|
||||
* to it's unicode value, and store it in aString.
|
||||
* @update gess5/11/98
|
||||
* @param aString will contain the resulting unicode string value
|
||||
* @return int (unicode char or unicode index from table)
|
||||
*/
|
||||
virtual PRInt32 TranslateToUnicodeStr(nsString& aString) const;
|
||||
|
||||
/**
|
||||
*
|
||||
* @update gess5/11/98
|
||||
* @param
|
||||
* @return
|
||||
*/
|
||||
virtual void AddAttribute(CToken* aToken);
|
||||
|
||||
/**
|
||||
* This getter retrieves the line number from the input source where
|
||||
* the token occured. Lines are interpreted as occuring between \n characters.
|
||||
* @update gess7/24/98
|
||||
* @return int containing the line number the token was found on
|
||||
*/
|
||||
virtual PRInt32 GetSourceLineNumber(void) const;
|
||||
|
||||
/** This method pop the attribute token from the given index
|
||||
* @update harishd 03/25/99
|
||||
* @return token at anIndex
|
||||
*/
|
||||
virtual CToken* PopAttributeToken();
|
||||
|
||||
/** Retrieve a string containing the tag and its attributes in "source" form
|
||||
* @update rickg 06June2000
|
||||
* @return void
|
||||
*/
|
||||
virtual void GetSource(nsString& aString);
|
||||
|
||||
/**
|
||||
* This pair of methods allows us to set a generic bit (for arbitrary use)
|
||||
* on each node stored in the context.
|
||||
* @update gess 11May2000
|
||||
*/
|
||||
virtual PRBool GetGenericState(void) const {return mGenericState;}
|
||||
virtual void SetGenericState(PRBool aState) {mGenericState=aState;}
|
||||
|
||||
/** Release all the objects you're holding
|
||||
* @update harishd 08/02/00
|
||||
* @return void
|
||||
*/
|
||||
virtual nsresult ReleaseAll();
|
||||
|
||||
CToken* mToken;
|
||||
PRInt32 mUseCount;
|
||||
PRPackedBool mGenericState;
|
||||
|
||||
nsTokenAllocator* mTokenAllocator;
|
||||
#ifdef HEAP_ALLOCATED_NODES
|
||||
nsNodeAllocator* mNodeAllocator; // weak
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
class nsCParserStartNode : public nsCParserNode
|
||||
{
|
||||
public:
|
||||
static nsCParserNode* Create(CToken* aToken,
|
||||
nsTokenAllocator* aTokenAllocator,
|
||||
nsNodeAllocator* aNodeAllocator)
|
||||
{
|
||||
#ifdef HEAP_ALLOCATED_NODES
|
||||
return new
|
||||
#else
|
||||
nsFixedSizeAllocator& pool = aNodeAllocator->GetArenaPool();
|
||||
void* place = pool.Alloc(sizeof(nsCParserStartNode));
|
||||
return ::new (place)
|
||||
#endif
|
||||
nsCParserStartNode(aToken, aTokenAllocator, aNodeAllocator);
|
||||
}
|
||||
|
||||
nsCParserStartNode()
|
||||
: nsCParserNode(), mAttributes(0) { }
|
||||
|
||||
nsCParserStartNode(CToken* aToken,
|
||||
nsTokenAllocator* aTokenAllocator,
|
||||
nsNodeAllocator* aNodeAllocator = 0)
|
||||
: nsCParserNode(aToken, aTokenAllocator, aNodeAllocator), mAttributes(0) { }
|
||||
|
||||
virtual ~nsCParserStartNode()
|
||||
{
|
||||
NS_ASSERTION(0 != mTokenAllocator, "Error: no token allocator");
|
||||
CToken* theAttrToken = 0;
|
||||
while ((theAttrToken = NS_STATIC_CAST(CToken*, mAttributes.Pop()))) {
|
||||
IF_FREE(theAttrToken, mTokenAllocator);
|
||||
}
|
||||
}
|
||||
|
||||
virtual nsresult Init(CToken* aToken,
|
||||
nsTokenAllocator* aTokenAllocator,
|
||||
nsNodeAllocator* aNodeAllocator = 0);
|
||||
virtual void AddAttribute(CToken* aToken);
|
||||
virtual PRInt32 GetAttributeCount(PRBool askToken = PR_FALSE) const;
|
||||
virtual const nsAString& GetKeyAt(PRUint32 anIndex) const;
|
||||
virtual const nsAString& GetValueAt(PRUint32 anIndex) const;
|
||||
virtual CToken* PopAttributeToken();
|
||||
virtual void GetSource(nsString& aString);
|
||||
virtual nsresult ReleaseAll();
|
||||
protected:
|
||||
nsDeque mAttributes;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
@ -1,195 +0,0 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either of the GNU General Public License Version 2 or later (the "GPL"),
|
||||
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#include "nsToken.h"
|
||||
#include "nsScanner.h"
|
||||
|
||||
|
||||
#ifdef MATCH_CTOR_DTOR
|
||||
MOZ_DECL_CTOR_COUNTER(CToken)
|
||||
#endif
|
||||
|
||||
static int TokenCount=0;
|
||||
static int DelTokenCount=0;
|
||||
|
||||
int CToken::GetTokenCount(){return TokenCount-DelTokenCount;}
|
||||
|
||||
|
||||
/**************************************************************
|
||||
And now for the CToken...
|
||||
**************************************************************/
|
||||
|
||||
/**
|
||||
* Default constructor
|
||||
*
|
||||
* @update gess 7/21/98
|
||||
*/
|
||||
CToken::CToken(PRInt32 aTag) {
|
||||
// Tokens are allocated through the arena ( not heap allocated..yay ).
|
||||
// We, therefore, don't need this macro anymore..
|
||||
#ifdef MATCH_CTOR_DTOR
|
||||
MOZ_COUNT_CTOR(CToken);
|
||||
#endif
|
||||
mAttrCount=0;
|
||||
mNewlineCount=0;
|
||||
mLineNumber = 0;
|
||||
mTypeID=aTag;
|
||||
// Note that the use count starts with 1 instead of 0. This
|
||||
// is because of the assumption that any token created is in
|
||||
// use and therefore does not require an explicit addref, or
|
||||
// rather IF_HOLD. This, also, will make sure that tokens created
|
||||
// on the stack do not accidently hit the arena recycler.
|
||||
mUseCount=1;
|
||||
|
||||
#ifdef NS_DEBUG
|
||||
++TokenCount;
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* Decstructor
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
*/
|
||||
CToken::~CToken() {
|
||||
// Tokens are allocated through the arena ( not heap allocated..yay ).
|
||||
// We, therefore, don't need this macro anymore..
|
||||
#ifdef MATCH_CTOR_DTOR
|
||||
MOZ_COUNT_DTOR(CToken);
|
||||
#endif
|
||||
++DelTokenCount;
|
||||
mUseCount=0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Virtual method used to tell this toke to consume his
|
||||
* valid chars.
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @param aChar -- first char in sequence
|
||||
* @param aScanner -- object to retrieve data from
|
||||
* @return int error code
|
||||
*/
|
||||
nsresult CToken::Consume(PRUnichar aChar,nsScanner& aScanner,PRInt32 aMode) {
|
||||
nsresult result=NS_OK;
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get string of full contents, suitable for debug dump.
|
||||
* It should look exactly like the input source.
|
||||
* @update gess5/11/98
|
||||
* @return reference to string containing string value
|
||||
*/
|
||||
void CToken::GetSource(nsString& anOutputString){
|
||||
anOutputString.Assign(GetStringValue());
|
||||
}
|
||||
|
||||
/**
|
||||
* @update harishd 3/23/00
|
||||
* @return reference to string containing string value
|
||||
*/
|
||||
void CToken::AppendSourceTo(nsAString& anOutputString){
|
||||
anOutputString.Append(GetStringValue());
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the internal ordinal value for this token.
|
||||
* This method is deprecated, and will soon be going away.
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @param value -- new ordinal value for this token
|
||||
*/
|
||||
void CToken::SetTypeID(PRInt32 aTypeID) {
|
||||
mTypeID=aTypeID;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves copy of internal ordinal value.
|
||||
* This method is deprecated, and will soon be going away.
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @return int containing ordinal value
|
||||
*/
|
||||
PRInt32 CToken::GetTypeID(void) {
|
||||
return mTypeID;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves copy of attr count for this token
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @return int containing attribute count
|
||||
*/
|
||||
PRInt16 CToken::GetAttributeCount(void) {
|
||||
return mAttrCount;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Retrieve type of token. This class returns -1, but
|
||||
* subclasses return something more meaningful.
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @return int value containing token type.
|
||||
*/
|
||||
PRInt32 CToken::GetTokenType(void) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* retrieve this tokens classname.
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @return char* containing name of class
|
||||
*/
|
||||
const char* CToken::GetClassName(void) {
|
||||
return "token";
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
*/
|
||||
void CToken::SelfTest(void) {
|
||||
#ifdef _DEBUG
|
||||
#endif
|
||||
}
|
||||
|
||||
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
Загрузка…
Ссылка в новой задаче