diff --git a/mozilla/htmlparser/src/nsHTMLTokens.cpp b/mozilla/htmlparser/src/nsHTMLTokens.cpp
index 2efdf2cf941..92556311dc3 100644
--- a/mozilla/htmlparser/src/nsHTMLTokens.cpp
+++ b/mozilla/htmlparser/src/nsHTMLTokens.cpp
@@ -536,8 +536,7 @@ nsresult CTextToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 aFlag)
static const PRUnichar theTerminalsChars[] =
{ PRUnichar('\n'), PRUnichar('\r'), PRUnichar('&'), PRUnichar('<'),
PRUnichar(0) };
- const nsDependentString theTerminals(theTerminalsChars,
- sizeof(theTerminalsChars)/sizeof(theTerminalsChars[0]) - 1);
+ static const nsReadEndCondition theEndCondition(theTerminalsChars);
nsresult result=NS_OK;
PRBool done=PR_FALSE;
nsReadingIterator origin, start, end;
@@ -550,7 +549,7 @@ nsresult CTextToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 aFlag)
aScanner.SetPosition(start);
while((NS_OK==result) && (!done)) {
- result=aScanner.ReadUntil(start, end, theTerminals,PR_FALSE);
+ result=aScanner.ReadUntil(start, end, theEndCondition, PR_FALSE);
if(NS_OK==result) {
result=aScanner.Peek(aChar);
@@ -792,12 +791,14 @@ PRInt32 CCDATASectionToken::GetTokenType(void) {
* @return error result
*/
nsresult CCDATASectionToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 aFlag) {
- static const char* theTerminals="\r]";
+ static const PRUnichar theTerminalsChars[] =
+ { PRUnichar('\r'), PRUnichar(']'), PRUnichar(0) };
+ static const nsReadEndCondition theEndCondition(theTerminalsChars);
nsresult result=NS_OK;
PRBool done=PR_FALSE;
while((NS_OK==result) && (!done)) {
- result=aScanner.ReadUntil(mTextValue,theTerminals,PR_FALSE);
+ result=aScanner.ReadUntil(mTextValue,theEndCondition,PR_FALSE);
if(NS_OK==result) {
result=aScanner.Peek(aChar);
if((kCR==aChar) && (NS_OK==result)) {
@@ -898,8 +899,7 @@ nsresult CMarkupDeclToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32
{ PRUnichar('\n'), PRUnichar('\r'), PRUnichar('\''), PRUnichar('"'),
PRUnichar('>'),
PRUnichar(0) };
- const nsDependentString theTerminals(theTerminalsChars,
- sizeof(theTerminalsChars)/sizeof(theTerminalsChars[0]) - 1);
+ static const nsReadEndCondition theEndCondition(theTerminalsChars);
nsresult result=NS_OK;
PRBool done=PR_FALSE;
PRUnichar quote=0;
@@ -910,7 +910,7 @@ nsresult CMarkupDeclToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32
while((NS_OK==result) && (!done)) {
aScanner.SetPosition(start);
- result=aScanner.ReadUntil(start, end, theTerminals,PR_FALSE);
+ result=aScanner.ReadUntil(start, end, theEndCondition, PR_FALSE);
if(NS_OK==result) {
result=aScanner.Peek(aChar);
@@ -1017,6 +1017,9 @@ CCommentToken::CCommentToken(const nsAReadableString& aName) : CHTMLToken(eHTMLT
static
nsresult ConsumeStrictComment(PRUnichar aChar, nsScanner& aScanner,nsString& aString) {
nsresult result=NS_OK;
+ static const PRUnichar theTerminalsChars[] =
+ { PRUnichar('-'), PRUnichar('>'), PRUnichar(0) };
+ static const nsReadEndCondition endCommentCondition(theTerminalsChars);
/*********************************************************
NOTE: This algorithm does a fine job of handling comments
@@ -1049,8 +1052,8 @@ nsresult ConsumeStrictComment(PRUnichar aChar, nsScanner& aScanner,nsString& aSt
aString+=temp;
if(NS_OK==result) {
if(NS_OK==result) {
- temp.AssignWithConversion("->");
- result=aScanner.ReadUntil(aString,temp,PR_FALSE);
+ // Read until "-" or ">"
+ result=aScanner.ReadUntil(aString,endCommentCondition,PR_FALSE);
}
}
}
@@ -1540,13 +1543,10 @@ nsresult ConsumeAttributeEntity(nsString& aString,
static
nsresult ConsumeAttributeValueText(nsString& aString,
nsScanner& aScanner,
- const PRUnichar *aTerminalChars,
+ const nsReadEndCondition& aEndCondition,
PRInt32 aFlag)
{
- const nsDependentString theTerminals(aTerminalChars,
- sizeof(aTerminalChars)/sizeof(aTerminalChars[0]) - 1);
-
- nsresult result=aScanner.ReadUntil(aString,theTerminals,PR_FALSE);
+ nsresult result=aScanner.ReadUntil(aString,aEndCondition,PR_FALSE);
if(NS_SUCCEEDED(result)) {
PRUnichar ch;
@@ -1554,7 +1554,7 @@ nsresult ConsumeAttributeValueText(nsString& aString,
if(ch==kAmpersand) {
result=ConsumeAttributeEntity(aString,aScanner,aFlag);
if (NS_SUCCEEDED(result)) {
- result=ConsumeAttributeValueText(aString,aScanner,aTerminalChars,aFlag);
+ result=ConsumeAttributeValueText(aString,aScanner,aEndCondition,aFlag);
}
}
}
@@ -1579,16 +1579,25 @@ nsresult ConsumeQuotedString(PRUnichar aChar,
{
NS_ASSERTION(aChar==kQuote || aChar==kApostrophe,"char is neither quote nor apostrophe");
- const PRUnichar theTerminalChars[] = {
- aChar, PRUnichar('&'),
- PRUnichar(0)
- };
+ static const PRUnichar theTerminalCharsQuote[] = {
+ PRUnichar(kQuote), PRUnichar('&'), PRUnichar(0) };
+ static const PRUnichar theTerminalCharsApostrophe[] = {
+ PRUnichar(kApostrophe), PRUnichar('&'), PRUnichar(0) };
+ static const nsReadEndCondition
+ theTerminateConditionQuote(theTerminalCharsQuote);
+ static const nsReadEndCondition
+ theTerminateConditionApostrophe(theTerminalCharsApostrophe);
+ // Assume Quote to init to something
+ const nsReadEndCondition *terminateCondition = &theTerminateConditionQuote;
+ if (aChar==kApostrophe)
+ terminateCondition = &theTerminateConditionApostrophe;
+
nsresult result=NS_OK;
nsReadingIterator theOffset;
aScanner.CurrentPosition(theOffset);
- result=ConsumeAttributeValueText(aString,aScanner,theTerminalChars,aFlag);
+ result=ConsumeAttributeValueText(aString,aScanner,*terminateCondition,aFlag);
if(NS_SUCCEEDED(result)) {
result = aScanner.SkipOver(aChar); // aChar should be " or '
@@ -1599,9 +1608,11 @@ nsresult ConsumeQuotedString(PRUnichar aChar,
// Ex Oops...You just tried to read a non-existent document:
";
@@ -533,17 +552,18 @@ nsresult nsScanner::SkipWhitespace(void) {
return kEOF;
}
- PRUnichar theChar=0;
- nsresult result=Peek(theChar);
- nsReadingIterator current, end;
- PRBool found=PR_FALSE;
+ nsReadingIterator current;
+ PRBool found;
+ PRBool skipped = PR_FALSE;
mNewlinesSkipped = 0;
current = mCurrentPosition;
- end = mEndPosition;
- while(current != end) {
- theChar=*current;
+ PRUnichar theChar=0;
+ nsresult result=Peek(theChar);
+ NS_ENSURE_SUCCESS(result, result);
+
+ while (current != mEndPosition) {
switch(theChar) {
case '\n': mNewlinesSkipped++;
case ' ' :
@@ -559,19 +579,22 @@ nsresult nsScanner::SkipWhitespace(void) {
if(!found) {
break;
}
- else {
- ++current;
- }
+ ++current;
+ theChar = *current;
+ skipped = PR_TRUE;
}
- SetPosition(current);
- if (current == end) {
+ if (!skipped)
+ return NS_OK;
+
+ if (current == mEndPosition) {
+ SetPosition(current);
return Eof();
}
- //DoErrTest(aString);
+ SetPosition(current);
- return result;
+ return NS_OK;
}
@@ -1156,156 +1179,113 @@ nsresult nsScanner::ReadWhile(nsString& aString,
* @return error code
*/
nsresult nsScanner::ReadUntil(nsAWritableString& aString,
- const nsAFlatString& aTerminalSet,
+ const nsReadEndCondition& aEndCondition,
PRBool addTerminal)
{
if (!mSlidingBuffer) {
return kEOF;
}
- PRUnichar theChar=0;
- nsresult result=Peek(theChar);
- nsReadingIterator origin, current, end;
- const PRUnichar* setstart = aTerminalSet.get();
+ nsReadingIterator origin, current;
+ const PRUnichar* setstart = aEndCondition.mChars;
const PRUnichar* setcurrent;
origin = mCurrentPosition;
current = origin;
- end = mEndPosition;
-
- while(current != end) {
- setcurrent = setstart;
- theChar=*current;
- if(theChar) {
- while (*setcurrent) {
- if (*setcurrent == theChar) {
- if(addTerminal)
- ++current;
- AppendUnicodeTo(origin, current, aString);
- goto found;
- }
- ++setcurrent;
- }
- }
- ++current;
- }
-found:
-
- SetPosition(current);
- if (current == end) {
- AppendUnicodeTo(origin, current, aString);
- return Eof();
- }
-
- //DoErrTest(aString);
-
- return result;
-
-}
-
-/**
- * Consume characters until you encounter one contained in given
- * input set.
- *
- * @update gess 3/25/98
- * @param aString will contain the result of this method
- * @param aTerminalSet is an ordered string that contains
- * the set of INVALID characters
- * @return error code
- */
-nsresult nsScanner::ReadUntil(nsAWritableString& aString,
- const nsAFlatCString& aTerminalSet,
- PRBool addTerminal)
-{
- if (!mSlidingBuffer) {
- return kEOF;
- }
PRUnichar theChar=0;
nsresult result=Peek(theChar);
- nsReadingIterator origin, current, end;
- const char* setstart = aTerminalSet.get();
- const char* setcurrent;
+ NS_ENSURE_SUCCESS(result, result);
+
+ while (current != mEndPosition) {
+ // Filter out completely wrong characters
+ // Check if all bits are in the required area
+ if(!(theChar & aEndCondition.mFilter)) {
+ // They were. Do a thorough check.
- origin = mCurrentPosition;
- current = origin;
- end = mEndPosition;
-
- while(current != end) {
- setcurrent = setstart;
- theChar=*current;
- if(theChar) {
+ setcurrent = setstart;
while (*setcurrent) {
if (*setcurrent == theChar) {
- if(addTerminal)
- ++current;
- AppendUnicodeTo(origin, current, aString);
goto found;
}
++setcurrent;
}
}
+
++current;
+ theChar = *current;
}
-found:
+ // If we are here, we didn't find any terminator in the string and
+ // current = mEndPosition
SetPosition(current);
- if (current == end) {
- AppendUnicodeTo(origin, current, aString);
- return Eof();
- }
+ AppendUnicodeTo(origin, current, aString);
+ return Eof();
+
+found:
+ if(addTerminal)
+ ++current;
+ AppendUnicodeTo(origin, current, aString);
+ SetPosition(current);
+
//DoErrTest(aString);
- return result;
+ return NS_OK;
}
-
nsresult nsScanner::ReadUntil(nsReadingIterator& aStart,
nsReadingIterator& aEnd,
- const nsAFlatString& aTerminalSet,
+ const nsReadEndCondition &aEndCondition,
PRBool addTerminal)
{
if (!mSlidingBuffer) {
return kEOF;
}
- PRUnichar theChar=0;
- nsresult result=Peek(theChar);
- nsReadingIterator origin, current, end;
- const PRUnichar* setstart = aTerminalSet.get();
+ nsReadingIterator origin, current;
+ const PRUnichar* setstart = aEndCondition.mChars;
const PRUnichar* setcurrent;
origin = mCurrentPosition;
current = origin;
- end = mEndPosition;
- while(current != end) {
- setcurrent = setstart;
- theChar=*current;
- if(theChar) {
+ PRUnichar theChar=0;
+ nsresult result=Peek(theChar);
+ NS_ENSURE_SUCCESS(result, result);
+
+ while (current != mEndPosition) {
+ // Filter out completely wrong characters
+ // Check if all bits are in the required area
+ if(!(theChar & aEndCondition.mFilter)) {
+ // They were. Do a thorough check.
+ setcurrent = setstart;
while (*setcurrent) {
if (*setcurrent == theChar) {
- if(addTerminal)
- ++current;
- aStart = origin;
- aEnd = current;
goto found;
}
- ++setcurrent;
+ ++setcurrent;
}
}
+
++current;
+ theChar = *current;
}
-found:
+ // If we are here, we didn't find any terminator in the string and
+ // current = mEndPosition
SetPosition(current);
- if (current == end) {
- aStart = origin;
- aEnd = current;
- return Eof();
- }
+ aStart = origin;
+ aEnd = current;
+ return Eof();
- return result;
+ found:
+ if(addTerminal)
+ ++current;
+ aStart = origin;
+ aEnd = current;
+ SetPosition(current);
+
+ return NS_OK;
}
/**
@@ -1323,36 +1303,32 @@ nsresult nsScanner::ReadUntil(nsAWritableString& aString,
return kEOF;
}
- PRUnichar theChar=0;
- nsresult result=Peek(theChar);
- nsReadingIterator origin, current, end;
+ nsReadingIterator origin, current;
origin = mCurrentPosition;
current = origin;
- end = mEndPosition;
- while(current != end) {
-
- theChar=*current;
- if(theChar) {
- if(aTerminalChar==theChar) {
- if(addTerminal)
- ++current;
- AppendUnicodeTo(origin, current, aString);
- break;
- }
+ PRUnichar theChar;
+ nsresult result=Peek(theChar);
+ NS_ENSURE_SUCCESS(result, result);
+
+ while (current != mEndPosition) {
+ if (aTerminalChar == theChar) {
+ if(addTerminal)
+ ++current;
+ AppendUnicodeTo(origin, current, aString);
+ SetPosition(current);
+ return NS_OK;
}
++current;
+ theChar = *current;
}
+ // If we are here, we didn't find any terminator in the string and
+ // current = mEndPosition
+ AppendUnicodeTo(origin, current, aString);
SetPosition(current);
- if (current == end) {
- AppendUnicodeTo(origin, current, aString);
- return Eof();
- }
-
- //DoErrTest(aString);
- return result;
+ return Eof();
}
diff --git a/mozilla/htmlparser/src/nsScanner.h b/mozilla/htmlparser/src/nsScanner.h
index bfb70c7ae02..14fb9a5e633 100644
--- a/mozilla/htmlparser/src/nsScanner.h
+++ b/mozilla/htmlparser/src/nsScanner.h
@@ -54,6 +54,16 @@ class nsScannerString : public nsSlidingString {
PRUnichar aChar);
};
+class nsReadEndCondition {
+public:
+ const PRUnichar *mChars;
+ PRUnichar mFilter;
+ explicit nsReadEndCondition(const PRUnichar* aTerminateChars);
+private:
+ nsReadEndCondition(const nsReadEndCondition& aOther); // No copying
+ void operator=(const nsReadEndCondition& aOther); // No assigning
+};
+
class nsScanner {
public:
@@ -216,25 +226,12 @@ class nsScanner {
* @return error code
*/
nsresult ReadUntil(nsAWritableString& aString,
- const nsAFlatString& aTermSet,
+ const nsReadEndCondition& aEndCondition,
PRBool addTerminal);
- nsresult ReadUntil(nsAWritableString& aString,
- const nsAFlatCString& aTermSet,
- PRBool addTerminal);
-
- nsresult ReadUntil(nsAWritableString& aString,
- const char* aTerminalSet,
- PRBool addTerminal)
- {
- return ReadUntil(aString,
- nsDependentCString(aTerminalSet),
- addTerminal);
- }
-
nsresult ReadUntil(nsReadingIterator& aStart,
nsReadingIterator& aEnd,
- const nsAFlatString& aTerminalSet,
+ const nsReadEndCondition& aEndCondition,
PRBool addTerminal);
diff --git a/mozilla/parser/htmlparser/src/nsHTMLTokens.cpp b/mozilla/parser/htmlparser/src/nsHTMLTokens.cpp
index 2efdf2cf941..92556311dc3 100644
--- a/mozilla/parser/htmlparser/src/nsHTMLTokens.cpp
+++ b/mozilla/parser/htmlparser/src/nsHTMLTokens.cpp
@@ -536,8 +536,7 @@ nsresult CTextToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 aFlag)
static const PRUnichar theTerminalsChars[] =
{ PRUnichar('\n'), PRUnichar('\r'), PRUnichar('&'), PRUnichar('<'),
PRUnichar(0) };
- const nsDependentString theTerminals(theTerminalsChars,
- sizeof(theTerminalsChars)/sizeof(theTerminalsChars[0]) - 1);
+ static const nsReadEndCondition theEndCondition(theTerminalsChars);
nsresult result=NS_OK;
PRBool done=PR_FALSE;
nsReadingIterator origin, start, end;
@@ -550,7 +549,7 @@ nsresult CTextToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 aFlag)
aScanner.SetPosition(start);
while((NS_OK==result) && (!done)) {
- result=aScanner.ReadUntil(start, end, theTerminals,PR_FALSE);
+ result=aScanner.ReadUntil(start, end, theEndCondition, PR_FALSE);
if(NS_OK==result) {
result=aScanner.Peek(aChar);
@@ -792,12 +791,14 @@ PRInt32 CCDATASectionToken::GetTokenType(void) {
* @return error result
*/
nsresult CCDATASectionToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 aFlag) {
- static const char* theTerminals="\r]";
+ static const PRUnichar theTerminalsChars[] =
+ { PRUnichar('\r'), PRUnichar(']'), PRUnichar(0) };
+ static const nsReadEndCondition theEndCondition(theTerminalsChars);
nsresult result=NS_OK;
PRBool done=PR_FALSE;
while((NS_OK==result) && (!done)) {
- result=aScanner.ReadUntil(mTextValue,theTerminals,PR_FALSE);
+ result=aScanner.ReadUntil(mTextValue,theEndCondition,PR_FALSE);
if(NS_OK==result) {
result=aScanner.Peek(aChar);
if((kCR==aChar) && (NS_OK==result)) {
@@ -898,8 +899,7 @@ nsresult CMarkupDeclToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32
{ PRUnichar('\n'), PRUnichar('\r'), PRUnichar('\''), PRUnichar('"'),
PRUnichar('>'),
PRUnichar(0) };
- const nsDependentString theTerminals(theTerminalsChars,
- sizeof(theTerminalsChars)/sizeof(theTerminalsChars[0]) - 1);
+ static const nsReadEndCondition theEndCondition(theTerminalsChars);
nsresult result=NS_OK;
PRBool done=PR_FALSE;
PRUnichar quote=0;
@@ -910,7 +910,7 @@ nsresult CMarkupDeclToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32
while((NS_OK==result) && (!done)) {
aScanner.SetPosition(start);
- result=aScanner.ReadUntil(start, end, theTerminals,PR_FALSE);
+ result=aScanner.ReadUntil(start, end, theEndCondition, PR_FALSE);
if(NS_OK==result) {
result=aScanner.Peek(aChar);
@@ -1017,6 +1017,9 @@ CCommentToken::CCommentToken(const nsAReadableString& aName) : CHTMLToken(eHTMLT
static
nsresult ConsumeStrictComment(PRUnichar aChar, nsScanner& aScanner,nsString& aString) {
nsresult result=NS_OK;
+ static const PRUnichar theTerminalsChars[] =
+ { PRUnichar('-'), PRUnichar('>'), PRUnichar(0) };
+ static const nsReadEndCondition endCommentCondition(theTerminalsChars);
/*********************************************************
NOTE: This algorithm does a fine job of handling comments
@@ -1049,8 +1052,8 @@ nsresult ConsumeStrictComment(PRUnichar aChar, nsScanner& aScanner,nsString& aSt
aString+=temp;
if(NS_OK==result) {
if(NS_OK==result) {
- temp.AssignWithConversion("->");
- result=aScanner.ReadUntil(aString,temp,PR_FALSE);
+ // Read until "-" or ">"
+ result=aScanner.ReadUntil(aString,endCommentCondition,PR_FALSE);
}
}
}
@@ -1540,13 +1543,10 @@ nsresult ConsumeAttributeEntity(nsString& aString,
static
nsresult ConsumeAttributeValueText(nsString& aString,
nsScanner& aScanner,
- const PRUnichar *aTerminalChars,
+ const nsReadEndCondition& aEndCondition,
PRInt32 aFlag)
{
- const nsDependentString theTerminals(aTerminalChars,
- sizeof(aTerminalChars)/sizeof(aTerminalChars[0]) - 1);
-
- nsresult result=aScanner.ReadUntil(aString,theTerminals,PR_FALSE);
+ nsresult result=aScanner.ReadUntil(aString,aEndCondition,PR_FALSE);
if(NS_SUCCEEDED(result)) {
PRUnichar ch;
@@ -1554,7 +1554,7 @@ nsresult ConsumeAttributeValueText(nsString& aString,
if(ch==kAmpersand) {
result=ConsumeAttributeEntity(aString,aScanner,aFlag);
if (NS_SUCCEEDED(result)) {
- result=ConsumeAttributeValueText(aString,aScanner,aTerminalChars,aFlag);
+ result=ConsumeAttributeValueText(aString,aScanner,aEndCondition,aFlag);
}
}
}
@@ -1579,16 +1579,25 @@ nsresult ConsumeQuotedString(PRUnichar aChar,
{
NS_ASSERTION(aChar==kQuote || aChar==kApostrophe,"char is neither quote nor apostrophe");
- const PRUnichar theTerminalChars[] = {
- aChar, PRUnichar('&'),
- PRUnichar(0)
- };
+ static const PRUnichar theTerminalCharsQuote[] = {
+ PRUnichar(kQuote), PRUnichar('&'), PRUnichar(0) };
+ static const PRUnichar theTerminalCharsApostrophe[] = {
+ PRUnichar(kApostrophe), PRUnichar('&'), PRUnichar(0) };
+ static const nsReadEndCondition
+ theTerminateConditionQuote(theTerminalCharsQuote);
+ static const nsReadEndCondition
+ theTerminateConditionApostrophe(theTerminalCharsApostrophe);
+ // Assume Quote to init to something
+ const nsReadEndCondition *terminateCondition = &theTerminateConditionQuote;
+ if (aChar==kApostrophe)
+ terminateCondition = &theTerminateConditionApostrophe;
+
nsresult result=NS_OK;
nsReadingIterator theOffset;
aScanner.CurrentPosition(theOffset);
- result=ConsumeAttributeValueText(aString,aScanner,theTerminalChars,aFlag);
+ result=ConsumeAttributeValueText(aString,aScanner,*terminateCondition,aFlag);
if(NS_SUCCEEDED(result)) {
result = aScanner.SkipOver(aChar); // aChar should be " or '
@@ -1599,9 +1608,11 @@ nsresult ConsumeQuotedString(PRUnichar aChar,
// Ex Oops...You just tried to read a non-existent document:
";
@@ -533,17 +552,18 @@ nsresult nsScanner::SkipWhitespace(void) {
return kEOF;
}
- PRUnichar theChar=0;
- nsresult result=Peek(theChar);
- nsReadingIterator current, end;
- PRBool found=PR_FALSE;
+ nsReadingIterator current;
+ PRBool found;
+ PRBool skipped = PR_FALSE;
mNewlinesSkipped = 0;
current = mCurrentPosition;
- end = mEndPosition;
- while(current != end) {
- theChar=*current;
+ PRUnichar theChar=0;
+ nsresult result=Peek(theChar);
+ NS_ENSURE_SUCCESS(result, result);
+
+ while (current != mEndPosition) {
switch(theChar) {
case '\n': mNewlinesSkipped++;
case ' ' :
@@ -559,19 +579,22 @@ nsresult nsScanner::SkipWhitespace(void) {
if(!found) {
break;
}
- else {
- ++current;
- }
+ ++current;
+ theChar = *current;
+ skipped = PR_TRUE;
}
- SetPosition(current);
- if (current == end) {
+ if (!skipped)
+ return NS_OK;
+
+ if (current == mEndPosition) {
+ SetPosition(current);
return Eof();
}
- //DoErrTest(aString);
+ SetPosition(current);
- return result;
+ return NS_OK;
}
@@ -1156,156 +1179,113 @@ nsresult nsScanner::ReadWhile(nsString& aString,
* @return error code
*/
nsresult nsScanner::ReadUntil(nsAWritableString& aString,
- const nsAFlatString& aTerminalSet,
+ const nsReadEndCondition& aEndCondition,
PRBool addTerminal)
{
if (!mSlidingBuffer) {
return kEOF;
}
- PRUnichar theChar=0;
- nsresult result=Peek(theChar);
- nsReadingIterator origin, current, end;
- const PRUnichar* setstart = aTerminalSet.get();
+ nsReadingIterator origin, current;
+ const PRUnichar* setstart = aEndCondition.mChars;
const PRUnichar* setcurrent;
origin = mCurrentPosition;
current = origin;
- end = mEndPosition;
-
- while(current != end) {
- setcurrent = setstart;
- theChar=*current;
- if(theChar) {
- while (*setcurrent) {
- if (*setcurrent == theChar) {
- if(addTerminal)
- ++current;
- AppendUnicodeTo(origin, current, aString);
- goto found;
- }
- ++setcurrent;
- }
- }
- ++current;
- }
-found:
-
- SetPosition(current);
- if (current == end) {
- AppendUnicodeTo(origin, current, aString);
- return Eof();
- }
-
- //DoErrTest(aString);
-
- return result;
-
-}
-
-/**
- * Consume characters until you encounter one contained in given
- * input set.
- *
- * @update gess 3/25/98
- * @param aString will contain the result of this method
- * @param aTerminalSet is an ordered string that contains
- * the set of INVALID characters
- * @return error code
- */
-nsresult nsScanner::ReadUntil(nsAWritableString& aString,
- const nsAFlatCString& aTerminalSet,
- PRBool addTerminal)
-{
- if (!mSlidingBuffer) {
- return kEOF;
- }
PRUnichar theChar=0;
nsresult result=Peek(theChar);
- nsReadingIterator origin, current, end;
- const char* setstart = aTerminalSet.get();
- const char* setcurrent;
+ NS_ENSURE_SUCCESS(result, result);
+
+ while (current != mEndPosition) {
+ // Filter out completely wrong characters
+ // Check if all bits are in the required area
+ if(!(theChar & aEndCondition.mFilter)) {
+ // They were. Do a thorough check.
- origin = mCurrentPosition;
- current = origin;
- end = mEndPosition;
-
- while(current != end) {
- setcurrent = setstart;
- theChar=*current;
- if(theChar) {
+ setcurrent = setstart;
while (*setcurrent) {
if (*setcurrent == theChar) {
- if(addTerminal)
- ++current;
- AppendUnicodeTo(origin, current, aString);
goto found;
}
++setcurrent;
}
}
+
++current;
+ theChar = *current;
}
-found:
+ // If we are here, we didn't find any terminator in the string and
+ // current = mEndPosition
SetPosition(current);
- if (current == end) {
- AppendUnicodeTo(origin, current, aString);
- return Eof();
- }
+ AppendUnicodeTo(origin, current, aString);
+ return Eof();
+
+found:
+ if(addTerminal)
+ ++current;
+ AppendUnicodeTo(origin, current, aString);
+ SetPosition(current);
+
//DoErrTest(aString);
- return result;
+ return NS_OK;
}
-
nsresult nsScanner::ReadUntil(nsReadingIterator& aStart,
nsReadingIterator& aEnd,
- const nsAFlatString& aTerminalSet,
+ const nsReadEndCondition &aEndCondition,
PRBool addTerminal)
{
if (!mSlidingBuffer) {
return kEOF;
}
- PRUnichar theChar=0;
- nsresult result=Peek(theChar);
- nsReadingIterator origin, current, end;
- const PRUnichar* setstart = aTerminalSet.get();
+ nsReadingIterator origin, current;
+ const PRUnichar* setstart = aEndCondition.mChars;
const PRUnichar* setcurrent;
origin = mCurrentPosition;
current = origin;
- end = mEndPosition;
- while(current != end) {
- setcurrent = setstart;
- theChar=*current;
- if(theChar) {
+ PRUnichar theChar=0;
+ nsresult result=Peek(theChar);
+ NS_ENSURE_SUCCESS(result, result);
+
+ while (current != mEndPosition) {
+ // Filter out completely wrong characters
+ // Check if all bits are in the required area
+ if(!(theChar & aEndCondition.mFilter)) {
+ // They were. Do a thorough check.
+ setcurrent = setstart;
while (*setcurrent) {
if (*setcurrent == theChar) {
- if(addTerminal)
- ++current;
- aStart = origin;
- aEnd = current;
goto found;
}
- ++setcurrent;
+ ++setcurrent;
}
}
+
++current;
+ theChar = *current;
}
-found:
+ // If we are here, we didn't find any terminator in the string and
+ // current = mEndPosition
SetPosition(current);
- if (current == end) {
- aStart = origin;
- aEnd = current;
- return Eof();
- }
+ aStart = origin;
+ aEnd = current;
+ return Eof();
- return result;
+ found:
+ if(addTerminal)
+ ++current;
+ aStart = origin;
+ aEnd = current;
+ SetPosition(current);
+
+ return NS_OK;
}
/**
@@ -1323,36 +1303,32 @@ nsresult nsScanner::ReadUntil(nsAWritableString& aString,
return kEOF;
}
- PRUnichar theChar=0;
- nsresult result=Peek(theChar);
- nsReadingIterator origin, current, end;
+ nsReadingIterator origin, current;
origin = mCurrentPosition;
current = origin;
- end = mEndPosition;
- while(current != end) {
-
- theChar=*current;
- if(theChar) {
- if(aTerminalChar==theChar) {
- if(addTerminal)
- ++current;
- AppendUnicodeTo(origin, current, aString);
- break;
- }
+ PRUnichar theChar;
+ nsresult result=Peek(theChar);
+ NS_ENSURE_SUCCESS(result, result);
+
+ while (current != mEndPosition) {
+ if (aTerminalChar == theChar) {
+ if(addTerminal)
+ ++current;
+ AppendUnicodeTo(origin, current, aString);
+ SetPosition(current);
+ return NS_OK;
}
++current;
+ theChar = *current;
}
+ // If we are here, we didn't find any terminator in the string and
+ // current = mEndPosition
+ AppendUnicodeTo(origin, current, aString);
SetPosition(current);
- if (current == end) {
- AppendUnicodeTo(origin, current, aString);
- return Eof();
- }
-
- //DoErrTest(aString);
- return result;
+ return Eof();
}
diff --git a/mozilla/parser/htmlparser/src/nsScanner.h b/mozilla/parser/htmlparser/src/nsScanner.h
index bfb70c7ae02..14fb9a5e633 100644
--- a/mozilla/parser/htmlparser/src/nsScanner.h
+++ b/mozilla/parser/htmlparser/src/nsScanner.h
@@ -54,6 +54,16 @@ class nsScannerString : public nsSlidingString {
PRUnichar aChar);
};
+class nsReadEndCondition {
+public:
+ const PRUnichar *mChars;
+ PRUnichar mFilter;
+ explicit nsReadEndCondition(const PRUnichar* aTerminateChars);
+private:
+ nsReadEndCondition(const nsReadEndCondition& aOther); // No copying
+ void operator=(const nsReadEndCondition& aOther); // No assigning
+};
+
class nsScanner {
public:
@@ -216,25 +226,12 @@ class nsScanner {
* @return error code
*/
nsresult ReadUntil(nsAWritableString& aString,
- const nsAFlatString& aTermSet,
+ const nsReadEndCondition& aEndCondition,
PRBool addTerminal);
- nsresult ReadUntil(nsAWritableString& aString,
- const nsAFlatCString& aTermSet,
- PRBool addTerminal);
-
- nsresult ReadUntil(nsAWritableString& aString,
- const char* aTerminalSet,
- PRBool addTerminal)
- {
- return ReadUntil(aString,
- nsDependentCString(aTerminalSet),
- addTerminal);
- }
-
nsresult ReadUntil(nsReadingIterator& aStart,
nsReadingIterator& aEnd,
- const nsAFlatString& aTerminalSet,
+ const nsReadEndCondition& aEndCondition,
PRBool addTerminal);