From 70dca6cd03a546591ac55aabeaa67598c489990e Mon Sep 17 00:00:00 2001 From: "ftang%netscape.com" Date: Tue, 4 May 1999 20:01:55 +0000 Subject: [PATCH] better error handling in append method git-svn-id: svn://10.0.0.236/trunk@30170 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/htmlparser/src/nsScanner.cpp | 31 +++++++++++++++------ mozilla/parser/htmlparser/src/nsScanner.cpp | 31 +++++++++++++++------ 2 files changed, 46 insertions(+), 16 deletions(-) diff --git a/mozilla/htmlparser/src/nsScanner.cpp b/mozilla/htmlparser/src/nsScanner.cpp index a8cc8739f95..a9b9adf7d85 100644 --- a/mozilla/htmlparser/src/nsScanner.cpp +++ b/mozilla/htmlparser/src/nsScanner.cpp @@ -244,14 +244,29 @@ PRBool nsScanner::Append(nsString& aBuffer) { PRBool nsScanner::Append(const char* aBuffer, PRUint32 aLen){ if(mUnicodeDecoder) { - PRInt32 unicharLength = 0; - PRInt32 srcLength = aLen; - mUnicodeDecoder->Length(aBuffer, 0, aLen, &unicharLength); - PRUnichar *unichars = new PRUnichar [ unicharLength ]; - nsresult res = mUnicodeDecoder->Convert(unichars, 0, &unicharLength,aBuffer, 0, &srcLength ); - mBuffer.Append(unichars, unicharLength); - delete[] unichars; - mTotalRead += unicharLength; + PRInt32 unicharBufLen = 0; + mUnicodeDecoder->Length(aBuffer, 0, aLen, &unicharBufLen); + PRUnichar *unichars = new PRUnichar [ unicharBufLen ]; + nsresult res; + do { + PRInt32 srcLength = aLen; + PRInt32 unicharLength = unicharBufLen; + res = mUnicodeDecoder->Convert(unichars, 0, &unicharLength,aBuffer, 0, &srcLength ); + mBuffer.Append(unichars, unicharLength); + mTotalRead += unicharLength; + // if we failed, we consume one byte by replace it with U+FFFD + // and try conversion again. + if(NS_FAILED(res)) { + mBuffer.Append( (PRUnichar)0xFFFD); + mTotalRead++; + aBuffer += srcLength + 1; + aLen -= srcLength + 1; + } + } while (NS_FAILED(res) && (aLen > 0)); + // we continue convert the bytes data into Unicode + // if we have conversion error and we have more data. + + delete[] unichars; } else { diff --git a/mozilla/parser/htmlparser/src/nsScanner.cpp b/mozilla/parser/htmlparser/src/nsScanner.cpp index a8cc8739f95..a9b9adf7d85 100644 --- a/mozilla/parser/htmlparser/src/nsScanner.cpp +++ b/mozilla/parser/htmlparser/src/nsScanner.cpp @@ -244,14 +244,29 @@ PRBool nsScanner::Append(nsString& aBuffer) { PRBool nsScanner::Append(const char* aBuffer, PRUint32 aLen){ if(mUnicodeDecoder) { - PRInt32 unicharLength = 0; - PRInt32 srcLength = aLen; - mUnicodeDecoder->Length(aBuffer, 0, aLen, &unicharLength); - PRUnichar *unichars = new PRUnichar [ unicharLength ]; - nsresult res = mUnicodeDecoder->Convert(unichars, 0, &unicharLength,aBuffer, 0, &srcLength ); - mBuffer.Append(unichars, unicharLength); - delete[] unichars; - mTotalRead += unicharLength; + PRInt32 unicharBufLen = 0; + mUnicodeDecoder->Length(aBuffer, 0, aLen, &unicharBufLen); + PRUnichar *unichars = new PRUnichar [ unicharBufLen ]; + nsresult res; + do { + PRInt32 srcLength = aLen; + PRInt32 unicharLength = unicharBufLen; + res = mUnicodeDecoder->Convert(unichars, 0, &unicharLength,aBuffer, 0, &srcLength ); + mBuffer.Append(unichars, unicharLength); + mTotalRead += unicharLength; + // if we failed, we consume one byte by replace it with U+FFFD + // and try conversion again. + if(NS_FAILED(res)) { + mBuffer.Append( (PRUnichar)0xFFFD); + mTotalRead++; + aBuffer += srcLength + 1; + aLen -= srcLength + 1; + } + } while (NS_FAILED(res) && (aLen > 0)); + // we continue convert the bytes data into Unicode + // if we have conversion error and we have more data. + + delete[] unichars; } else {