From 7606504aaca084d78dbc5b8186203bd44aa6b257 Mon Sep 17 00:00:00 2001 From: "smontagu%netscape.com" Date: Wed, 24 Apr 2002 00:26:49 +0000 Subject: [PATCH] ArabicShaping() shouldn't assume that the input and output is in visual order. Bug 137871. r=ftang, sr=attinasi --- content/shared/public/nsBidiUtils.h | 5 ++- content/shared/src/nsBidiUtils.cpp | 58 ++++++++++++++++++----------- layout/base/nsBidiPresUtils.cpp | 3 +- layout/base/nsBidiUtils.cpp | 58 ++++++++++++++++++----------- layout/base/nsBidiUtils.h | 5 ++- layout/base/src/nsBidiPresUtils.cpp | 3 +- 6 files changed, 86 insertions(+), 46 deletions(-) diff --git a/content/shared/public/nsBidiUtils.h b/content/shared/public/nsBidiUtils.h index 8dd8ac5cbe16..59fbad645e95 100644 --- a/content/shared/public/nsBidiUtils.h +++ b/content/shared/public/nsBidiUtils.h @@ -36,9 +36,12 @@ * @param aLen is the length of aStrong * @param aBuf receives the shaped output * @param aBuflen receives the length of aBuf + * @param aInputLogical indicates that the input is in logical order + * @param aOutputLogical indicates that the output should be in logical order */ nsresult ArabicShaping(const PRUnichar* aString, PRUint32 aLen, - PRUnichar* aBuf, PRUint32* aBufLen); + PRUnichar* aBuf, PRUint32* aBufLen, + PRBool aInputLogical, PRBool aOutputLogical); /** * Scan an nsString, converting characters in the FExx range (Arabic presentation forms) to the equivalent characters in the 06xx diff --git a/content/shared/src/nsBidiUtils.cpp b/content/shared/src/nsBidiUtils.cpp index ffefefe6bc61..386452e05250 100644 --- a/content/shared/src/nsBidiUtils.cpp +++ b/content/shared/src/nsBidiUtils.cpp @@ -238,10 +238,29 @@ static PRUint16 gArabicLigatureMap[] = ((c) + (PRUint16)ARABIC_TO_HINDI_DIGIT_INCREMENT): \ (c)) -nsresult ArabicShaping(const PRUnichar* aString, PRUint32 aLen, - PRUnichar* aBuf, PRUint32 *aBufLen) +// helper function to reverse a PRUnichar buffer +void ReverseString(PRUnichar* aBuffer, PRUint32 aLen) { - const PRUnichar* src = aString; + PRUnichar *start, *end; + PRUnichar swapChar; + + for (start = aBuffer, end = aBuffer + aLen - 1; start < end; ++start, --end) { + swapChar = *start; + *start = *end; + *end = swapChar; + } +} + +nsresult ArabicShaping(const PRUnichar* aString, PRUint32 aLen, + PRUnichar* aBuf, PRUint32 *aBufLen, + PRBool aInputLogical, PRBool aOutputLogical) +{ + nsAutoString tempString(aString); + PRUnichar *tempBuf = (PRUnichar*)tempString.get(); + if (aInputLogical) { + ReverseString(tempBuf, aLen); + } + const PRUnichar* src = tempBuf; const PRUnichar* p; PRUnichar* dest = aBuf; PRUnichar formB; @@ -249,23 +268,23 @@ nsresult ArabicShaping(const PRUnichar* aString, PRUint32 aLen, PRInt8 leftNoTrJ, rightNoTrJ; thisJ = eNJ; rightJ = GetJoiningClass(*(src)); - while(src= aString ) && !IS_ARABIC_CHAR(*(src-1))))) + ( ( (src-1) >= tempBuf) && !IS_ARABIC_CHAR(*(src-1))))) leftNoTrJ = thisJ; - if(src-2 >= (aString)){ - for(p=src-2; (p >= (aString))&& (eTr == leftNoTrJ) && (IS_ARABIC_CHAR(*(p+1))) ; p--) + if(src-2 >= (tempBuf)){ + for(p=src-2; (p >= (tempBuf))&& (eTr == leftNoTrJ) && (IS_ARABIC_CHAR(*(p+1))) ; p--) leftNoTrJ = GetJoiningClass(*(p)) ; } thisJ = rightJ; rightJ = rightNoTrJ = GetJoiningClass(*(src+1)) ; - if(src+2 <= (aString+aLen-1)){ - for(p=src+2; (p <= (aString+aLen-1))&&(eTr == rightNoTrJ) && (IS_ARABIC_CHAR(*(src+1))); p++) + if(src+2 <= (tempBuf+aLen-1)){ + for(p=src+2; (p <= (tempBuf+aLen-1))&&(eTr == rightNoTrJ) && (IS_ARABIC_CHAR(*(src+1))); p++) rightNoTrJ = GetJoiningClass(*(p)) ; } @@ -275,11 +294,11 @@ nsresult ArabicShaping(const PRUnichar* aString, PRUint32 aLen, } if((eTr != thisJ) || - ((thisJ == eTr) && (((src-1)>=aString) && (!IS_ARABIC_CHAR(*(src-1)))))) + ((thisJ == eTr) && (((src-1)>=tempBuf) && (!IS_ARABIC_CHAR(*(src-1)))))) leftNoTrJ = thisJ; - if(src-2 >= (aString)){ - for(p=src-2; (src-2 >= (aString)) && (eTr == leftNoTrJ) && (IS_ARABIC_CHAR(*(p+1))); p--) + if(src-2 >= (tempBuf)){ + for(p=src-2; (src-2 >= (tempBuf)) && (eTr == leftNoTrJ) && (IS_ARABIC_CHAR(*(p+1))); p--) leftNoTrJ = GetJoiningClass(*(p)) ; } @@ -317,6 +336,9 @@ nsresult ArabicShaping(const PRUnichar* aString, PRUint32 aLen, *aBufLen = lDest - aBuf; + if (aOutputLogical) { + ReverseString(aBuf, *aBufLen); + } return NS_OK; } @@ -326,7 +348,6 @@ nsresult Conv_FE_06(const nsString& aSrc, nsString& aDst) PRUint32 i, size = aSrc.Length(); aDst.Truncate(); for (i=0;i= aString ) && !IS_ARABIC_CHAR(*(src-1))))) + ( ( (src-1) >= tempBuf) && !IS_ARABIC_CHAR(*(src-1))))) leftNoTrJ = thisJ; - if(src-2 >= (aString)){ - for(p=src-2; (p >= (aString))&& (eTr == leftNoTrJ) && (IS_ARABIC_CHAR(*(p+1))) ; p--) + if(src-2 >= (tempBuf)){ + for(p=src-2; (p >= (tempBuf))&& (eTr == leftNoTrJ) && (IS_ARABIC_CHAR(*(p+1))) ; p--) leftNoTrJ = GetJoiningClass(*(p)) ; } thisJ = rightJ; rightJ = rightNoTrJ = GetJoiningClass(*(src+1)) ; - if(src+2 <= (aString+aLen-1)){ - for(p=src+2; (p <= (aString+aLen-1))&&(eTr == rightNoTrJ) && (IS_ARABIC_CHAR(*(src+1))); p++) + if(src+2 <= (tempBuf+aLen-1)){ + for(p=src+2; (p <= (tempBuf+aLen-1))&&(eTr == rightNoTrJ) && (IS_ARABIC_CHAR(*(src+1))); p++) rightNoTrJ = GetJoiningClass(*(p)) ; } @@ -275,11 +294,11 @@ nsresult ArabicShaping(const PRUnichar* aString, PRUint32 aLen, } if((eTr != thisJ) || - ((thisJ == eTr) && (((src-1)>=aString) && (!IS_ARABIC_CHAR(*(src-1)))))) + ((thisJ == eTr) && (((src-1)>=tempBuf) && (!IS_ARABIC_CHAR(*(src-1)))))) leftNoTrJ = thisJ; - if(src-2 >= (aString)){ - for(p=src-2; (src-2 >= (aString)) && (eTr == leftNoTrJ) && (IS_ARABIC_CHAR(*(p+1))); p--) + if(src-2 >= (tempBuf)){ + for(p=src-2; (src-2 >= (tempBuf)) && (eTr == leftNoTrJ) && (IS_ARABIC_CHAR(*(p+1))); p--) leftNoTrJ = GetJoiningClass(*(p)) ; } @@ -317,6 +336,9 @@ nsresult ArabicShaping(const PRUnichar* aString, PRUint32 aLen, *aBufLen = lDest - aBuf; + if (aOutputLogical) { + ReverseString(aBuf, *aBufLen); + } return NS_OK; } @@ -326,7 +348,6 @@ nsresult Conv_FE_06(const nsString& aSrc, nsString& aDst) PRUint32 i, size = aSrc.Length(); aDst.Truncate(); for (i=0;i