diff --git a/mozilla/intl/unicharutil/util/nsBidiUtils.cpp b/mozilla/intl/unicharutil/util/nsBidiUtils.cpp index ffefefe6bc6..386452e0525 100644 --- a/mozilla/intl/unicharutil/util/nsBidiUtils.cpp +++ b/mozilla/intl/unicharutil/util/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