From dedba9892576d19b52a6852859300f88cdc76bee 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 --- htmlparser/src/nsScanner.cpp | 31 +++++++++++++++++++++-------- parser/htmlparser/src/nsScanner.cpp | 31 +++++++++++++++++++++-------- 2 files changed, 46 insertions(+), 16 deletions(-) diff --git a/htmlparser/src/nsScanner.cpp b/htmlparser/src/nsScanner.cpp index a8cc8739f95f..a9b9adf7d85d 100644 --- a/htmlparser/src/nsScanner.cpp +++ b/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/parser/htmlparser/src/nsScanner.cpp b/parser/htmlparser/src/nsScanner.cpp index a8cc8739f95f..a9b9adf7d85d 100644 --- a/parser/htmlparser/src/nsScanner.cpp +++ b/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 {