From c040285e002d33532dfffb511f379b5946e448b7 Mon Sep 17 00:00:00 2001 From: "dbaron%fas.harvard.edu" Date: Sat, 28 Apr 2001 02:03:18 +0000 Subject: [PATCH] Improve performance of nsScanner::ReadUntil by requiring the terminal set to be nsAFlatString and using an nested while loop rather than calling a string find function. b=65431 r=harishd@netscape.com sr=vidur@netscape.com git-svn-id: svn://10.0.0.236/trunk@93346 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/htmlparser/src/nsScanner.cpp | 75 ++++++++++++--------- mozilla/htmlparser/src/nsScanner.h | 6 +- mozilla/parser/htmlparser/src/nsScanner.cpp | 75 ++++++++++++--------- mozilla/parser/htmlparser/src/nsScanner.h | 6 +- 4 files changed, 92 insertions(+), 70 deletions(-) diff --git a/mozilla/htmlparser/src/nsScanner.cpp b/mozilla/htmlparser/src/nsScanner.cpp index 548cfe988af..42e1107c9ca 100644 --- a/mozilla/htmlparser/src/nsScanner.cpp +++ b/mozilla/htmlparser/src/nsScanner.cpp @@ -1156,7 +1156,7 @@ nsresult nsScanner::ReadWhile(nsString& aString, * @return error code */ nsresult nsScanner::ReadUntil(nsAWritableString& aString, - const nsAReadableString& aTerminalSet, + const nsAFlatString& aTerminalSet, PRBool addTerminal) { if (!mSlidingBuffer) { @@ -1165,27 +1165,31 @@ nsresult nsScanner::ReadUntil(nsAWritableString& aString, PRUnichar theChar=0; nsresult result=Peek(theChar); - nsReadingIterator origin, current, end, setstart, setend; + nsReadingIterator origin, current, end; + const PRUnichar* setstart = aTerminalSet.get(); + const PRUnichar* setcurrent; origin = mCurrentPosition; current = origin; end = mEndPosition; while(current != end) { - + setcurrent = setstart; theChar=*current; if(theChar) { - aTerminalSet.BeginReading(setstart); - aTerminalSet.EndReading(setend); - if (FindCharInReadable(theChar, setstart, setend)) { - if(addTerminal) - current++; - AppendUnicodeTo(origin, current, aString); - break; - } + while (*setcurrent) { + if (*setcurrent == theChar) { + if(addTerminal) + current++; + AppendUnicodeTo(origin, current, aString); + goto found; + } + setcurrent++; + } } current++; } +found: SetPosition(current); if (current == end) { @@ -1210,7 +1214,7 @@ nsresult nsScanner::ReadUntil(nsAWritableString& aString, * @return error code */ nsresult nsScanner::ReadUntil(nsAWritableString& aString, - const nsAReadableCString& aTerminalSet, + const nsAFlatCString& aTerminalSet, PRBool addTerminal) { if (!mSlidingBuffer) { @@ -1220,27 +1224,30 @@ nsresult nsScanner::ReadUntil(nsAWritableString& aString, PRUnichar theChar=0; nsresult result=Peek(theChar); nsReadingIterator origin, current, end; - nsReadingIterator setstart, setend; + const char* setstart = aTerminalSet.get(); + const char* setcurrent; origin = mCurrentPosition; current = origin; end = mEndPosition; while(current != end) { - + setcurrent = setstart; theChar=*current; if(theChar) { - aTerminalSet.BeginReading(setstart); - aTerminalSet.EndReading(setend); - if (FindCharInReadable(theChar, setstart, setend)) { - if(addTerminal) - current++; - AppendUnicodeTo(origin, current, aString); - break; + while (*setcurrent) { + if (*setcurrent == theChar) { + if(addTerminal) + current++; + AppendUnicodeTo(origin, current, aString); + goto found; + } + setcurrent++; } } current++; } +found: SetPosition(current); if (current == end) { @@ -1255,7 +1262,7 @@ nsresult nsScanner::ReadUntil(nsAWritableString& aString, nsresult nsScanner::ReadUntil(nsReadingIterator& aStart, nsReadingIterator& aEnd, - const nsAReadableString& aTerminalSet, + const nsAFlatString& aTerminalSet, PRBool addTerminal) { if (!mSlidingBuffer) { @@ -1264,28 +1271,32 @@ nsresult nsScanner::ReadUntil(nsReadingIterator& aStart, PRUnichar theChar=0; nsresult result=Peek(theChar); - nsReadingIterator origin, current, end, setstart, setend; + nsReadingIterator origin, current, end; + const PRUnichar* setstart = aTerminalSet.get(); + const PRUnichar* setcurrent; origin = mCurrentPosition; current = origin; end = mEndPosition; while(current != end) { - + setcurrent = setstart; theChar=*current; if(theChar) { - aTerminalSet.BeginReading(setstart); - aTerminalSet.EndReading(setend); - if (FindCharInReadable(theChar, setstart, setend)) { - if(addTerminal) - current++; - aStart = origin; - aEnd = current; - break; + while (*setcurrent) { + if (*setcurrent == theChar) { + if(addTerminal) + current++; + aStart = origin; + aEnd = current; + goto found; + } + setcurrent++; } } current++; } +found: SetPosition(current); if (current == end) { diff --git a/mozilla/htmlparser/src/nsScanner.h b/mozilla/htmlparser/src/nsScanner.h index 8b0937a5b9c..5d7aa73d1cb 100644 --- a/mozilla/htmlparser/src/nsScanner.h +++ b/mozilla/htmlparser/src/nsScanner.h @@ -215,11 +215,11 @@ class nsScanner { * @return error code */ nsresult ReadUntil(nsAWritableString& aString, - const nsAReadableString& aTermSet, + const nsAFlatString& aTermSet, PRBool addTerminal); nsresult ReadUntil(nsAWritableString& aString, - const nsAReadableCString& aTermSet, + const nsAFlatCString& aTermSet, PRBool addTerminal); nsresult ReadUntil(nsAWritableString& aString, @@ -233,7 +233,7 @@ class nsScanner { nsresult ReadUntil(nsReadingIterator& aStart, nsReadingIterator& aEnd, - const nsAReadableString& aTerminalSet, + const nsAFlatString& aTerminalSet, PRBool addTerminal); diff --git a/mozilla/parser/htmlparser/src/nsScanner.cpp b/mozilla/parser/htmlparser/src/nsScanner.cpp index 548cfe988af..42e1107c9ca 100644 --- a/mozilla/parser/htmlparser/src/nsScanner.cpp +++ b/mozilla/parser/htmlparser/src/nsScanner.cpp @@ -1156,7 +1156,7 @@ nsresult nsScanner::ReadWhile(nsString& aString, * @return error code */ nsresult nsScanner::ReadUntil(nsAWritableString& aString, - const nsAReadableString& aTerminalSet, + const nsAFlatString& aTerminalSet, PRBool addTerminal) { if (!mSlidingBuffer) { @@ -1165,27 +1165,31 @@ nsresult nsScanner::ReadUntil(nsAWritableString& aString, PRUnichar theChar=0; nsresult result=Peek(theChar); - nsReadingIterator origin, current, end, setstart, setend; + nsReadingIterator origin, current, end; + const PRUnichar* setstart = aTerminalSet.get(); + const PRUnichar* setcurrent; origin = mCurrentPosition; current = origin; end = mEndPosition; while(current != end) { - + setcurrent = setstart; theChar=*current; if(theChar) { - aTerminalSet.BeginReading(setstart); - aTerminalSet.EndReading(setend); - if (FindCharInReadable(theChar, setstart, setend)) { - if(addTerminal) - current++; - AppendUnicodeTo(origin, current, aString); - break; - } + while (*setcurrent) { + if (*setcurrent == theChar) { + if(addTerminal) + current++; + AppendUnicodeTo(origin, current, aString); + goto found; + } + setcurrent++; + } } current++; } +found: SetPosition(current); if (current == end) { @@ -1210,7 +1214,7 @@ nsresult nsScanner::ReadUntil(nsAWritableString& aString, * @return error code */ nsresult nsScanner::ReadUntil(nsAWritableString& aString, - const nsAReadableCString& aTerminalSet, + const nsAFlatCString& aTerminalSet, PRBool addTerminal) { if (!mSlidingBuffer) { @@ -1220,27 +1224,30 @@ nsresult nsScanner::ReadUntil(nsAWritableString& aString, PRUnichar theChar=0; nsresult result=Peek(theChar); nsReadingIterator origin, current, end; - nsReadingIterator setstart, setend; + const char* setstart = aTerminalSet.get(); + const char* setcurrent; origin = mCurrentPosition; current = origin; end = mEndPosition; while(current != end) { - + setcurrent = setstart; theChar=*current; if(theChar) { - aTerminalSet.BeginReading(setstart); - aTerminalSet.EndReading(setend); - if (FindCharInReadable(theChar, setstart, setend)) { - if(addTerminal) - current++; - AppendUnicodeTo(origin, current, aString); - break; + while (*setcurrent) { + if (*setcurrent == theChar) { + if(addTerminal) + current++; + AppendUnicodeTo(origin, current, aString); + goto found; + } + setcurrent++; } } current++; } +found: SetPosition(current); if (current == end) { @@ -1255,7 +1262,7 @@ nsresult nsScanner::ReadUntil(nsAWritableString& aString, nsresult nsScanner::ReadUntil(nsReadingIterator& aStart, nsReadingIterator& aEnd, - const nsAReadableString& aTerminalSet, + const nsAFlatString& aTerminalSet, PRBool addTerminal) { if (!mSlidingBuffer) { @@ -1264,28 +1271,32 @@ nsresult nsScanner::ReadUntil(nsReadingIterator& aStart, PRUnichar theChar=0; nsresult result=Peek(theChar); - nsReadingIterator origin, current, end, setstart, setend; + nsReadingIterator origin, current, end; + const PRUnichar* setstart = aTerminalSet.get(); + const PRUnichar* setcurrent; origin = mCurrentPosition; current = origin; end = mEndPosition; while(current != end) { - + setcurrent = setstart; theChar=*current; if(theChar) { - aTerminalSet.BeginReading(setstart); - aTerminalSet.EndReading(setend); - if (FindCharInReadable(theChar, setstart, setend)) { - if(addTerminal) - current++; - aStart = origin; - aEnd = current; - break; + while (*setcurrent) { + if (*setcurrent == theChar) { + if(addTerminal) + current++; + aStart = origin; + aEnd = current; + goto found; + } + setcurrent++; } } current++; } +found: SetPosition(current); if (current == end) { diff --git a/mozilla/parser/htmlparser/src/nsScanner.h b/mozilla/parser/htmlparser/src/nsScanner.h index 8b0937a5b9c..5d7aa73d1cb 100644 --- a/mozilla/parser/htmlparser/src/nsScanner.h +++ b/mozilla/parser/htmlparser/src/nsScanner.h @@ -215,11 +215,11 @@ class nsScanner { * @return error code */ nsresult ReadUntil(nsAWritableString& aString, - const nsAReadableString& aTermSet, + const nsAFlatString& aTermSet, PRBool addTerminal); nsresult ReadUntil(nsAWritableString& aString, - const nsAReadableCString& aTermSet, + const nsAFlatCString& aTermSet, PRBool addTerminal); nsresult ReadUntil(nsAWritableString& aString, @@ -233,7 +233,7 @@ class nsScanner { nsresult ReadUntil(nsReadingIterator& aStart, nsReadingIterator& aEnd, - const nsAReadableString& aTerminalSet, + const nsAFlatString& aTerminalSet, PRBool addTerminal);