1998-04-14 00:24:54 +04:00
|
|
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
2007-01-25 04:25:41 +03:00
|
|
|
/* vim: set ts=2 sw=2 et tw=78: */
|
2012-05-21 15:12:37 +04:00
|
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
1998-04-14 00:24:54 +04:00
|
|
|
|
1998-05-07 11:19:47 +04:00
|
|
|
//#define __INCREMENTAL 1
|
1998-04-14 00:24:54 +04:00
|
|
|
|
2017-06-17 05:54:40 +03:00
|
|
|
#include "nsScanner.h"
|
|
|
|
|
2015-12-25 10:01:32 +03:00
|
|
|
#include "mozilla/Attributes.h"
|
2013-10-27 11:55:19 +04:00
|
|
|
#include "mozilla/DebugOnly.h"
|
2017-06-17 05:54:40 +03:00
|
|
|
#include "mozilla/Encoding.h"
|
1998-04-14 00:24:54 +04:00
|
|
|
#include "nsDebug.h"
|
2000-12-13 00:58:14 +03:00
|
|
|
#include "nsReadableUtils.h"
|
2003-03-15 04:04:32 +03:00
|
|
|
#include "nsIInputStream.h"
|
2012-06-06 06:08:30 +04:00
|
|
|
#include "nsIFile.h"
|
2004-02-19 05:44:03 +03:00
|
|
|
#include "nsUTF8Utils.h" // for LossyConvertEncoding
|
2004-08-24 22:37:33 +04:00
|
|
|
#include "nsCRT.h"
|
2004-11-02 22:52:32 +03:00
|
|
|
#include "nsParser.h"
|
2012-03-22 18:42:42 +04:00
|
|
|
#include "nsCharsetSource.h"
|
2000-12-13 00:58:14 +03:00
|
|
|
|
2014-01-04 19:02:17 +04:00
|
|
|
nsReadEndCondition::nsReadEndCondition(const char16_t* aTerminateChars)
|
|
|
|
: mChars(aTerminateChars),
|
|
|
|
mFilter(char16_t(~0)) // All bits set
|
2001-08-16 09:24:17 +04:00
|
|
|
{
|
|
|
|
// Build filter that will be used to filter out characters with
|
|
|
|
// bits that none of the terminal chars have. This works very well
|
|
|
|
// because terminal chars often have only the last 4-6 bits set and
|
|
|
|
// normal ascii letters have bit 7 set. Other letters have even higher
|
|
|
|
// bits set.
|
2018-11-30 13:46:48 +03:00
|
|
|
|
2001-08-16 09:24:17 +04:00
|
|
|
// Calculate filter
|
2014-01-04 19:02:17 +04:00
|
|
|
const char16_t* current = aTerminateChars;
|
|
|
|
char16_t terminalChar = *current;
|
2001-08-16 09:24:17 +04:00
|
|
|
while (terminalChar) {
|
|
|
|
mFilter &= ~terminalChar;
|
|
|
|
++current;
|
|
|
|
terminalChar = *current;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1998-05-15 02:19:08 +04:00
|
|
|
/**
|
1998-07-25 01:57:43 +04:00
|
|
|
* Use this constructor if you want i/o to be based on
|
|
|
|
* a single string you hand in during construction.
|
|
|
|
* This short cut was added for Javascript.
|
|
|
|
*
|
|
|
|
* @update gess 5/12/98
|
|
|
|
* @param aMode represents the parser mode (nav, other)
|
|
|
|
* @return
|
|
|
|
*/
|
2012-11-06 15:57:51 +04:00
|
|
|
nsScanner::nsScanner(const nsAString& anHTMLString) {
|
1999-10-15 03:37:21 +04:00
|
|
|
MOZ_COUNT_CTOR(nsScanner);
|
2002-03-07 19:45:25 +03:00
|
|
|
|
2012-07-30 18:20:58 +04:00
|
|
|
mSlidingBuffer = nullptr;
|
2008-07-14 17:05:15 +04:00
|
|
|
if (AppendToBuffer(anHTMLString)) {
|
|
|
|
mSlidingBuffer->BeginReading(mCurrentPosition);
|
|
|
|
} else {
|
|
|
|
/* XXX see hack below, re: bug 182067 */
|
|
|
|
memset(&mCurrentPosition, 0, sizeof(mCurrentPosition));
|
|
|
|
mEndPosition = mCurrentPosition;
|
|
|
|
}
|
2002-03-07 19:45:25 +03:00
|
|
|
mMarkPosition = mCurrentPosition;
|
2011-10-17 18:59:28 +04:00
|
|
|
mIncremental = false;
|
2016-11-10 06:11:27 +03:00
|
|
|
mUnicodeDecoder = nullptr;
|
1999-03-08 23:00:23 +03:00
|
|
|
mCharsetSource = kCharsetUninitialized;
|
1998-07-25 01:57:43 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Use this constructor if you want i/o to be based on strings
|
|
|
|
* the scanner receives. If you pass a null filename, you
|
1998-07-14 01:13:09 +04:00
|
|
|
* can still provide data to the scanner via append.
|
1998-05-15 02:19:08 +04:00
|
|
|
*/
|
2012-11-06 15:57:51 +04:00
|
|
|
nsScanner::nsScanner(nsString& aFilename, bool aCreateStream)
|
2011-05-06 19:45:33 +04:00
|
|
|
: mFilename(aFilename) {
|
1999-10-15 03:37:21 +04:00
|
|
|
MOZ_COUNT_CTOR(nsScanner);
|
2007-06-27 04:21:47 +04:00
|
|
|
NS_ASSERTION(!aCreateStream, "This is always true.");
|
2002-03-07 19:45:25 +03:00
|
|
|
|
2012-07-30 18:20:58 +04:00
|
|
|
mSlidingBuffer = nullptr;
|
2004-02-19 05:44:03 +03:00
|
|
|
|
|
|
|
// XXX This is a big hack. We need to initialize the iterators to something.
|
|
|
|
// What matters is that mCurrentPosition == mEndPosition, so that our methods
|
|
|
|
// believe that we are at EOF (see bug 182067). We null out mCurrentPosition
|
|
|
|
// so that we have some hope of catching null pointer dereferences associated
|
|
|
|
// with this hack. --darin
|
|
|
|
memset(&mCurrentPosition, 0, sizeof(mCurrentPosition));
|
2003-01-31 03:58:41 +03:00
|
|
|
mMarkPosition = mCurrentPosition;
|
|
|
|
mEndPosition = mCurrentPosition;
|
2004-02-19 05:44:03 +03:00
|
|
|
|
2011-10-17 18:59:28 +04:00
|
|
|
mIncremental = true;
|
2003-03-15 04:04:32 +03:00
|
|
|
|
2016-11-10 06:11:27 +03:00
|
|
|
mUnicodeDecoder = nullptr;
|
1999-03-08 23:00:23 +03:00
|
|
|
mCharsetSource = kCharsetUninitialized;
|
2012-11-06 15:57:51 +04:00
|
|
|
// XML defaults to UTF-8 and about:blank is UTF-8, too.
|
2017-06-18 14:37:50 +03:00
|
|
|
SetDocumentCharset(UTF_8_ENCODING, kCharsetFromDocTypeDefault);
|
1999-02-01 21:23:31 +03:00
|
|
|
}
|
1999-02-16 10:38:27 +03:00
|
|
|
|
2017-06-18 14:37:50 +03:00
|
|
|
nsresult nsScanner::SetDocumentCharset(NotNull<const Encoding*> aEncoding,
|
|
|
|
int32_t aSource) {
|
2013-10-27 11:55:19 +04:00
|
|
|
if (aSource < mCharsetSource) // priority is lower than the current one
|
2008-10-01 10:48:47 +04:00
|
|
|
return NS_OK;
|
1999-03-08 23:00:23 +03:00
|
|
|
|
2013-10-27 11:55:19 +04:00
|
|
|
mCharsetSource = aSource;
|
2017-06-17 05:54:40 +03:00
|
|
|
nsCString charsetName;
|
2017-06-18 14:37:50 +03:00
|
|
|
aEncoding->Name(charsetName);
|
2013-10-27 11:55:19 +04:00
|
|
|
if (!mCharset.IsEmpty() && charsetName.Equals(mCharset)) {
|
|
|
|
return NS_OK; // no difference, don't change it
|
2008-01-30 01:12:22 +03:00
|
|
|
}
|
1999-03-08 23:00:23 +03:00
|
|
|
|
2008-01-30 01:12:22 +03:00
|
|
|
// different, need to change it
|
1999-03-08 23:00:23 +03:00
|
|
|
|
2012-11-06 15:57:51 +04:00
|
|
|
mCharset.Assign(charsetName);
|
2008-01-30 01:12:22 +03:00
|
|
|
|
2017-06-18 14:37:50 +03:00
|
|
|
mUnicodeDecoder = aEncoding->NewDecoderWithBOMRemoval();
|
2008-01-30 01:12:22 +03:00
|
|
|
|
2013-11-26 11:31:52 +04:00
|
|
|
return NS_OK;
|
1998-07-10 09:35:23 +04:00
|
|
|
}
|
|
|
|
|
1998-05-01 00:23:07 +04:00
|
|
|
/**
|
1998-04-14 00:24:54 +04:00
|
|
|
* default destructor
|
|
|
|
*
|
|
|
|
* @update gess 3/25/98
|
|
|
|
* @param
|
|
|
|
* @return
|
1998-05-01 00:23:07 +04:00
|
|
|
*/
|
1999-01-09 04:09:02 +03:00
|
|
|
nsScanner::~nsScanner() {
|
2011-05-17 18:01:36 +04:00
|
|
|
delete mSlidingBuffer;
|
2000-12-13 00:58:14 +03:00
|
|
|
|
1999-10-15 03:37:21 +04:00
|
|
|
MOZ_COUNT_DTOR(nsScanner);
|
1998-05-15 02:19:08 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Resets current offset position of input stream to marked position.
|
|
|
|
* This allows us to back up to this point if the need should arise,
|
|
|
|
* such as when tokenization gets interrupted.
|
|
|
|
* NOTE: IT IS REALLY BAD FORM TO CALL RELEASE WITHOUT CALLING MARK FIRST!
|
|
|
|
*
|
|
|
|
* @update gess 5/12/98
|
|
|
|
* @param
|
|
|
|
* @return
|
|
|
|
*/
|
2000-12-13 00:58:14 +03:00
|
|
|
void nsScanner::RewindToMark(void) {
|
2004-06-08 22:54:57 +04:00
|
|
|
if (mSlidingBuffer) {
|
|
|
|
mCurrentPosition = mMarkPosition;
|
|
|
|
}
|
1998-05-15 02:19:08 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Records current offset position in input stream. This allows us
|
|
|
|
* to back up to this point if the need should arise, such as when
|
|
|
|
* tokenization gets interrupted.
|
|
|
|
*
|
1998-08-04 01:04:54 +04:00
|
|
|
* @update gess 7/29/98
|
1998-05-15 02:19:08 +04:00
|
|
|
* @param
|
|
|
|
* @return
|
|
|
|
*/
|
2012-08-22 19:56:38 +04:00
|
|
|
int32_t nsScanner::Mark() {
|
|
|
|
int32_t distance = 0;
|
2000-12-13 00:58:14 +03:00
|
|
|
if (mSlidingBuffer) {
|
2008-10-01 10:48:47 +04:00
|
|
|
nsScannerIterator oldStart;
|
|
|
|
mSlidingBuffer->BeginReading(oldStart);
|
|
|
|
|
|
|
|
distance = Distance(oldStart, mCurrentPosition);
|
|
|
|
|
2002-03-16 06:03:45 +03:00
|
|
|
mSlidingBuffer->DiscardPrefix(mCurrentPosition);
|
|
|
|
mSlidingBuffer->BeginReading(mCurrentPosition);
|
2000-12-13 00:58:14 +03:00
|
|
|
mMarkPosition = mCurrentPosition;
|
1998-08-04 01:04:54 +04:00
|
|
|
}
|
2008-10-01 10:48:47 +04:00
|
|
|
|
|
|
|
return distance;
|
1998-05-15 02:19:08 +04:00
|
|
|
}
|
|
|
|
|
2000-01-15 23:35:57 +03:00
|
|
|
/**
|
|
|
|
* Insert data to our underlying input buffer as
|
|
|
|
* if it were read from an input stream.
|
|
|
|
*
|
|
|
|
* @update harishd 01/12/99
|
|
|
|
* @return error code
|
|
|
|
*/
|
2011-09-29 10:19:26 +04:00
|
|
|
bool nsScanner::UngetReadable(const nsAString& aBuffer) {
|
2004-06-08 22:54:57 +04:00
|
|
|
if (!mSlidingBuffer) {
|
2011-10-17 18:59:28 +04:00
|
|
|
return false;
|
2004-06-08 22:54:57 +04:00
|
|
|
}
|
2001-02-14 00:26:58 +03:00
|
|
|
|
2002-03-07 19:45:25 +03:00
|
|
|
mSlidingBuffer->UngetReadable(aBuffer, mCurrentPosition);
|
|
|
|
mSlidingBuffer->BeginReading(
|
|
|
|
mCurrentPosition); // Insertion invalidated our iterators
|
|
|
|
mSlidingBuffer->EndReading(mEndPosition);
|
2018-11-30 13:46:48 +03:00
|
|
|
|
2011-10-17 18:59:28 +04:00
|
|
|
return true;
|
2000-01-15 23:35:57 +03:00
|
|
|
}
|
|
|
|
|
1998-05-15 02:19:08 +04:00
|
|
|
/**
|
1998-07-14 01:13:09 +04:00
|
|
|
* Append data to our underlying input buffer as
|
|
|
|
* if it were read from an input stream.
|
1998-05-15 02:19:08 +04:00
|
|
|
*
|
|
|
|
* @update gess4/3/98
|
1998-08-04 01:04:54 +04:00
|
|
|
* @return error code
|
1998-05-15 02:19:08 +04:00
|
|
|
*/
|
2002-03-24 03:16:18 +03:00
|
|
|
nsresult nsScanner::Append(const nsAString& aBuffer) {
|
2008-07-14 17:05:15 +04:00
|
|
|
if (!AppendToBuffer(aBuffer)) return NS_ERROR_OUT_OF_MEMORY;
|
2001-04-01 02:44:05 +04:00
|
|
|
return NS_OK;
|
1998-05-15 02:19:08 +04:00
|
|
|
}
|
|
|
|
|
1998-05-22 00:38:32 +04:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* @update gess 5/21/98
|
|
|
|
* @param
|
|
|
|
* @return
|
|
|
|
*/
|
2017-02-17 09:44:49 +03:00
|
|
|
nsresult nsScanner::Append(const char* aBuffer, uint32_t aLen) {
|
2011-06-24 12:50:25 +04:00
|
|
|
nsresult res = NS_OK;
|
2007-06-27 04:21:47 +04:00
|
|
|
if (mUnicodeDecoder) {
|
2017-04-27 13:27:03 +03:00
|
|
|
CheckedInt<size_t> needed = mUnicodeDecoder->MaxUTF16BufferLength(aLen);
|
|
|
|
if (!needed.isValid()) {
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
2015-06-17 14:21:39 +03:00
|
|
|
}
|
2017-04-27 13:27:03 +03:00
|
|
|
CheckedInt<uint32_t> allocLen(1); // null terminator due to legacy sadness
|
|
|
|
allocLen += needed.value();
|
|
|
|
if (!allocLen.isValid()) {
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
}
|
|
|
|
nsScannerString::Buffer* buffer =
|
|
|
|
nsScannerString::AllocBuffer(allocLen.value());
|
2004-02-19 05:44:03 +03:00
|
|
|
NS_ENSURE_TRUE(buffer, NS_ERROR_OUT_OF_MEMORY);
|
2014-01-04 19:02:17 +04:00
|
|
|
char16_t* unichars = buffer->DataStart();
|
2004-12-22 03:21:13 +03:00
|
|
|
|
2017-04-27 13:27:03 +03:00
|
|
|
uint32_t result;
|
|
|
|
size_t read;
|
|
|
|
size_t written;
|
|
|
|
Tie(result, read, written) =
|
|
|
|
mUnicodeDecoder->DecodeToUTF16WithoutReplacement(
|
|
|
|
AsBytes(MakeSpan(aBuffer, aLen)),
|
|
|
|
MakeSpan(unichars, needed.value()),
|
|
|
|
false); // Retain bug about failure to handle EOF
|
|
|
|
MOZ_ASSERT(result != kOutputFull);
|
|
|
|
MOZ_ASSERT(read <= aLen);
|
|
|
|
MOZ_ASSERT(written <= needed.value());
|
|
|
|
if (result != kInputEmpty) {
|
|
|
|
// Since about:blank is empty, this line runs only for XML. Use a
|
|
|
|
// character that's illegal in XML instead of U+FFFD in order to make
|
|
|
|
// expat flag the error. There is no need to loop and convert more, since
|
|
|
|
// expat will stop here anyway.
|
|
|
|
unichars[written++] = 0xFFFF;
|
|
|
|
}
|
|
|
|
buffer->SetDataLength(written);
|
2001-07-13 22:21:23 +04:00
|
|
|
// Don't propagate return code of unicode decoder
|
|
|
|
// since it doesn't reflect on our success or failure
|
|
|
|
// - Ref. bug 87110
|
|
|
|
res = NS_OK;
|
2008-07-14 17:05:15 +04:00
|
|
|
if (!AppendToBuffer(buffer)) res = NS_ERROR_OUT_OF_MEMORY;
|
1999-07-19 09:30:49 +04:00
|
|
|
} else {
|
2007-06-27 04:21:47 +04:00
|
|
|
NS_WARNING("No decoder found.");
|
|
|
|
res = NS_ERROR_FAILURE;
|
1999-03-07 22:23:28 +03:00
|
|
|
}
|
1999-02-01 21:23:31 +03:00
|
|
|
|
2001-04-01 02:44:05 +04:00
|
|
|
return res;
|
1998-05-22 00:38:32 +04:00
|
|
|
}
|
|
|
|
|
1998-05-01 00:23:07 +04:00
|
|
|
/**
|
1998-04-14 00:24:54 +04:00
|
|
|
* retrieve next char from scanners internal input stream
|
|
|
|
*
|
|
|
|
* @update gess 3/25/98
|
|
|
|
* @param
|
|
|
|
* @return error code reflecting read status
|
1998-05-01 00:23:07 +04:00
|
|
|
*/
|
2014-01-04 19:02:17 +04:00
|
|
|
nsresult nsScanner::GetChar(char16_t& aChar) {
|
2007-06-27 04:21:47 +04:00
|
|
|
if (!mSlidingBuffer || mCurrentPosition == mEndPosition) {
|
|
|
|
aChar = 0;
|
2016-12-23 05:51:04 +03:00
|
|
|
return NS_ERROR_HTMLPARSER_EOF;
|
2000-12-13 00:58:14 +03:00
|
|
|
}
|
|
|
|
|
2007-06-27 04:21:47 +04:00
|
|
|
aChar = *mCurrentPosition++;
|
1998-07-24 01:10:19 +04:00
|
|
|
|
2007-06-27 04:21:47 +04:00
|
|
|
return NS_OK;
|
1998-04-14 00:24:54 +04:00
|
|
|
}
|
|
|
|
|
2004-02-19 05:44:03 +03:00
|
|
|
void nsScanner::BindSubstring(nsScannerSubstring& aSubstring,
|
|
|
|
const nsScannerIterator& aStart,
|
|
|
|
const nsScannerIterator& aEnd) {
|
2000-12-13 00:58:14 +03:00
|
|
|
aSubstring.Rebind(*mSlidingBuffer, aStart, aEnd);
|
|
|
|
}
|
|
|
|
|
2004-02-19 05:44:03 +03:00
|
|
|
void nsScanner::CurrentPosition(nsScannerIterator& aPosition) {
|
2000-12-13 00:58:14 +03:00
|
|
|
aPosition = mCurrentPosition;
|
|
|
|
}
|
1999-12-03 03:30:29 +03:00
|
|
|
|
2004-02-19 05:44:03 +03:00
|
|
|
void nsScanner::EndReading(nsScannerIterator& aPosition) {
|
2000-12-13 00:58:14 +03:00
|
|
|
aPosition = mEndPosition;
|
|
|
|
}
|
2018-11-30 13:46:48 +03:00
|
|
|
|
2017-02-17 09:44:49 +03:00
|
|
|
void nsScanner::SetPosition(nsScannerIterator& aPosition, bool aTerminate) {
|
2000-12-13 00:58:14 +03:00
|
|
|
if (mSlidingBuffer) {
|
|
|
|
mCurrentPosition = aPosition;
|
|
|
|
if (aTerminate && (mCurrentPosition == mEndPosition)) {
|
|
|
|
mMarkPosition = mCurrentPosition;
|
|
|
|
mSlidingBuffer->DiscardPrefix(mCurrentPosition);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-02-17 09:44:49 +03:00
|
|
|
bool nsScanner::AppendToBuffer(nsScannerString::Buffer* aBuf) {
|
2000-12-13 00:58:14 +03:00
|
|
|
if (!mSlidingBuffer) {
|
2004-02-19 05:44:03 +03:00
|
|
|
mSlidingBuffer = new nsScannerString(aBuf);
|
2008-07-14 17:05:15 +04:00
|
|
|
if (!mSlidingBuffer) return false;
|
2000-12-13 00:58:14 +03:00
|
|
|
mSlidingBuffer->BeginReading(mCurrentPosition);
|
|
|
|
mMarkPosition = mCurrentPosition;
|
|
|
|
mSlidingBuffer->EndReading(mEndPosition);
|
|
|
|
} else {
|
2004-02-19 05:44:03 +03:00
|
|
|
mSlidingBuffer->AppendBuffer(aBuf);
|
2000-12-13 00:58:14 +03:00
|
|
|
if (mCurrentPosition == mEndPosition) {
|
|
|
|
mSlidingBuffer->BeginReading(mCurrentPosition);
|
|
|
|
}
|
|
|
|
mSlidingBuffer->EndReading(mEndPosition);
|
2009-02-16 15:22:47 +03:00
|
|
|
}
|
|
|
|
|
2011-10-17 18:59:28 +04:00
|
|
|
return true;
|
2004-02-19 05:44:03 +03:00
|
|
|
}
|
|
|
|
|
1999-02-01 07:24:37 +03:00
|
|
|
/**
|
2000-12-13 00:58:14 +03:00
|
|
|
* call this to copy bytes out of the scanner that have not yet been consumed
|
1999-02-01 07:24:37 +03:00
|
|
|
* by the tokenization process.
|
|
|
|
*
|
|
|
|
* @update gess 5/12/98
|
|
|
|
* @param aCopyBuffer is where the scanner buffer will be copied to
|
2016-02-09 13:45:59 +03:00
|
|
|
* @return true if OK or false on OOM
|
1999-02-01 07:24:37 +03:00
|
|
|
*/
|
2016-02-09 13:45:59 +03:00
|
|
|
bool nsScanner::CopyUnusedData(nsString& aCopyBuffer) {
|
2004-06-08 22:54:57 +04:00
|
|
|
if (!mSlidingBuffer) {
|
|
|
|
aCopyBuffer.Truncate();
|
2016-02-09 13:45:59 +03:00
|
|
|
return true;
|
2004-06-08 22:54:57 +04:00
|
|
|
}
|
|
|
|
|
2004-02-19 05:44:03 +03:00
|
|
|
nsScannerIterator start, end;
|
2000-12-13 00:58:14 +03:00
|
|
|
start = mCurrentPosition;
|
|
|
|
end = mEndPosition;
|
|
|
|
|
2016-02-09 13:45:59 +03:00
|
|
|
return CopyUnicodeTo(start, end, aCopyBuffer);
|
1999-02-01 07:24:37 +03:00
|
|
|
}
|
|
|
|
|
1998-07-14 01:13:09 +04:00
|
|
|
/**
|
|
|
|
* Retrieve the name of the file that the scanner is reading from.
|
|
|
|
* In some cases, it's just a given name, because the scanner isn't
|
|
|
|
* really reading from a file.
|
|
|
|
*
|
|
|
|
* @update gess 5/12/98
|
|
|
|
* @return
|
|
|
|
*/
|
1999-01-09 04:09:02 +03:00
|
|
|
nsString& nsScanner::GetFilename(void) { return mFilename; }
|
1998-07-14 01:13:09 +04:00
|
|
|
|
1998-05-01 00:23:07 +04:00
|
|
|
/**
|
1998-04-14 00:24:54 +04:00
|
|
|
* Conduct self test. Actually, selftesting for this class
|
|
|
|
* occurs in the parser selftest.
|
|
|
|
*
|
|
|
|
* @update gess 3/25/98
|
|
|
|
* @param
|
|
|
|
* @return
|
1998-05-01 00:23:07 +04:00
|
|
|
*/
|
1998-04-14 00:24:54 +04:00
|
|
|
|
1999-01-09 04:09:02 +03:00
|
|
|
void nsScanner::SelfTest(void) {
|
1998-04-14 00:24:54 +04:00
|
|
|
#ifdef _DEBUG
|
|
|
|
#endif
|
|
|
|
}
|