Back to index

lightning-sunbird  0.9+nobinonly
Defines | Enumerations | Functions | Variables
nsBidiUtils.cpp File Reference
#include "nsBidiUtils.h"

Go to the source code of this file.

Defines

#define FE_TO_06_OFFSET   0xfe70
#define PresentationToOriginal(c, order)
#define PresentationFormB(c, form)
#define RightJCClass(j)   (eRightJCMask&(j))
#define LeftJCClass(j)   (eLeftJCMask&(j))
#define DecideForm(jl, j, jr)
#define GetJoiningClass(c)
#define ARABIC_TO_HINDI_DIGIT_INCREMENT   (START_HINDI_DIGITS - START_ARABIC_DIGITS)
#define NUM_TO_ARABIC(c)
#define NUM_TO_HINDI(c)

Enumerations

enum  eArabicForm { eIsolated, eFinal, eInitial, eMedial }
enum  eArabicJoiningClass {
  eTr = 0, eRJ = 1, eLJ = 2, eDJ = 3,
  eNJ = 4, eJC = 7, eRightJCMask = 2, eLeftJCMask = 1
}

Functions

static void ReverseString (PRUnichar *aBuffer, PRUint32 aLen)
nsresult ArabicShaping (const PRUnichar *aString, PRUint32 aLen, PRUnichar *aBuf, PRUint32 *aBufLen, PRBool aInputLogical, PRBool aOutputLogical)
 Perform Arabic shaping on a Unichar string.
nsresult Conv_FE_06 (const nsString &aSrc, nsString &aDst)
 Scan an nsString, converting characters in the FExx range (Arabic presentation forms) to the equivalent characters in the 06xx range.
nsresult Conv_FE_06_WithReverse (const nsString &aSrc, nsString &aDst)
 Scan an nsString, converting characters in the FExx range (Arabic presentation forms) to the equivalent characters in the 06xx range, and also reverse the string.
nsresult Conv_06_FE_WithReverse (const nsString &aSrc, nsString &aDst, PRUint32 aDir)
 Scan an nsString, converting characters in the 06xx range to the equivalent characters in the 0Fxx range (Arabic presentation forms), with the option to reverse the string.
nsresult HandleNumbers (PRUnichar *aBuffer, PRUint32 aSize, PRUint32 aNumFlag)
 Scan a Unichar string, converting numbers to Arabic or Hindi forms in place.
nsresult HandleNumbers (const nsString &aSrc, nsString &aDst)
 Scan an nsString, converting numerals to Arabic or Hindi forms.

Variables

static const PRUnichar FE_TO_06 [][2]
static const PRUnichar FB_TO_06 []
static const PRUint8 gArabicMap1 []
static const PRUint8 gArabicMap2 []
static const PRUint8 gArabicMapEx []
static const PRInt8 gJoiningClass []
static const PRUint16 gArabicLigatureMap []

Define Documentation

Definition at line 252 of file nsBidiUtils.cpp.

#define DecideForm (   jl,
  j,
  jr 
)
Value:
(((eRJ == (j)) && RightJCClass(jr)) ? eFinal              \
                                      :                     \
   ((eDJ == (j)) ?                                          \
    ((RightJCClass(jr)) ?                                   \
     (((LeftJCClass(jl)) ? eMedial                          \
                         : eFinal))                         \
                        :                                   \
     (((LeftJCClass(jl)) ? eInitial                         \
                         : eIsolated))                      \
    )                     : eIsolated))                     \

Definition at line 186 of file nsBidiUtils.cpp.

#define FE_TO_06_OFFSET   0xfe70

Definition at line 44 of file nsBidiUtils.cpp.

Value:
((IS_ARABIC_CHAR(c)) ?                     \
      (gJoiningClass[(c) - 0x0600]) :        \
      ((0x200D == (c)) ? eJC : eTr))

Definition at line 235 of file nsBidiUtils.cpp.

#define LeftJCClass (   j)    (eLeftJCMask&(j))

Definition at line 184 of file nsBidiUtils.cpp.

Value:

Definition at line 253 of file nsBidiUtils.cpp.

Value:

Definition at line 257 of file nsBidiUtils.cpp.

#define PresentationFormB (   c,
  form 
)
Value:
(((0x0622<=(c)) && ((c)<=0x063A)) ?                                  \
      (0xFE00|(gArabicMap1[(c)-0x0622] + (form))) :                      \
       (((0x0641<=(c)) && ((c)<=0x064A)) ?                               \
        (0xFE00|(gArabicMap2[(c)-0x0641] + (form))) :                    \
         (((0x0671<=(c)) && ((c))<=0x06D3) && gArabicMapEx[(c)-0x0671]) ? \
          (0xFB00|(gArabicMapEx[(c)-0x0671] + (form))) : (c)))

Definition at line 157 of file nsBidiUtils.cpp.

#define PresentationToOriginal (   c,
  order 
)
Value:
(((0xFE70 <= (c) && (c) <= 0xFEFC)) ?                 \
         FE_TO_06[(c)- FE_TO_06_OFFSET][order] :                    \
     (((0xFB50 <= (c) && (c) <= 0xFBFF) && (order) == 0) ? \
         FB_TO_06[(c)-0xFB50] : (PRUnichar) 0x0000))

Definition at line 121 of file nsBidiUtils.cpp.

#define RightJCClass (   j)    (eRightJCMask&(j))

Definition at line 183 of file nsBidiUtils.cpp.


Enumeration Type Documentation

Enumerator:
eIsolated 
eFinal 
eInitial 
eMedial 

Definition at line 165 of file nsBidiUtils.cpp.

             {
   eIsolated,  // or Char N
   eFinal,     // or Char R
   eInitial,   // or Char L
   eMedial     // or Char M
} eArabicForm;
Enumerator:
eTr 
eRJ 
eLJ 
eDJ 
eNJ 
eJC 
eRightJCMask 
eLeftJCMask 

Definition at line 172 of file nsBidiUtils.cpp.

             {
   eTr = 0, // Transparent
   eRJ = 1, // Right-Joining
   eLJ = 2, // Left-Joining
   eDJ = 3, // Dual-Joining
   eNJ = 4, // Non-Joining
   eJC = 7, // Joining Causing
   eRightJCMask = 2, // bit of Right-Join Causing 
   eLeftJCMask = 1   // bit of Left-Join Causing 
} eArabicJoiningClass;

Function Documentation

nsresult ArabicShaping ( const PRUnichar aString,
PRUint32  aLen,
PRUnichar aBuf,
PRUint32 aBufLen,
PRBool  aInputLogical,
PRBool  aOutputLogical 
)

Perform Arabic shaping on a Unichar string.

Parameters:
aStringis the input string
aLenis the length of aStrong
aBufreceives the shaped output
aBuflenreceives the length of aBuf
aInputLogicalindicates that the input is in logical order
aOutputLogicalindicates that the output should be in logical order

Definition at line 275 of file nsBidiUtils.cpp.

{
  nsAutoString tempString(aString, aLen);
  if (tempString.Length() != aLen)
    return NS_ERROR_OUT_OF_MEMORY;
  PRUnichar *tempBuf = tempString.BeginWriting();
  if (aInputLogical) {
    ReverseString(tempBuf, aLen);
  }
  const PRUnichar* src = tempBuf;
  const PRUnichar* p;
  PRUnichar* dest = aBuf;
  PRUnichar formB;
  PRInt8 leftJ, thisJ, rightJ;
  PRInt8 leftNoTrJ, rightNoTrJ;
  thisJ = leftNoTrJ = eNJ;
  rightJ = GetJoiningClass(*(src));
  while(src<tempBuf+aLen-1) {
    leftJ = thisJ;

    if ((eTr != leftJ) || ((leftJ == eTr) && 
        ( ( (src-1) >= tempBuf) && !IS_ARABIC_CHAR(*(src-1)))))
      leftNoTrJ = thisJ;

    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 <= (tempBuf+aLen-1)){
      for(p=src+2; (p <= (tempBuf+aLen-1))&&(eTr == rightNoTrJ) && (IS_ARABIC_CHAR(*(src+1))); p++)
        rightNoTrJ = GetJoiningClass(*(p)) ;
    }

    formB = PresentationFormB(*src, DecideForm(leftNoTrJ, thisJ, rightNoTrJ));
    *dest++ = formB;
    src++;

  }
  if((eTr != thisJ) || 
     ((thisJ == eTr) && (((src-1)>=tempBuf) && (!IS_ARABIC_CHAR(*(src-1))))))
    leftNoTrJ = thisJ;

  if(src-2 >= (tempBuf)){
    for(p=src-2; (src-2 >= (tempBuf)) && (eTr == leftNoTrJ) && (IS_ARABIC_CHAR(*(p+1))); p--)
      leftNoTrJ = GetJoiningClass(*(p)) ;
  }

  formB = PresentationFormB(*src, DecideForm(leftNoTrJ, rightJ, eNJ));
  *dest++ = formB;
  src++;

  PRUnichar *lSrc = aBuf;
  PRUnichar *lDest = aBuf;
  while(lSrc < (dest-1)) {
    PRUnichar next = *(lSrc+1);
    if(((0xFEDF == next) || (0xFEE0 == next)) && 
       (0xFE80 == (0xFFF1 & *lSrc))) {
      PRBool done = PR_FALSE;
      PRUint16 key = ((*lSrc) << 8) | ( 0x00FF & next);
      PRUint16 i;
      for(i=0;i<8;i++) {
        if(key == gArabicLigatureMap[i]) {
          done = PR_TRUE;
          // lam and alef in the source are mapped to a lam-alef ligature in the
          // destination, so lSrc is incremented by 2 here
          *lDest++ = 0xFEF5 + i;
          lSrc+=2;
          break;
        }
      }
      if(! done)
        *lDest++ = *lSrc++; 
    } else if (0x200C == *lSrc || 0x200D == *lSrc)
    // Strip zero-width joining controls ZWJ and ZWNJ from the shaped text
      lSrc++;
    else 
      *lDest++ = *lSrc++; 

  }
  if(lSrc < dest)
    *lDest++ = *lSrc++; 

  *aBufLen = lDest - aBuf;
  NS_ASSERTION(*aBufLen <= aLen, "ArabicShaping() likely did a buffer overflow!");

  if (aOutputLogical) {
    ReverseString(aBuf, *aBufLen);
  }
  return NS_OK;
}

Here is the call graph for this function:

Here is the caller graph for this function:

nsresult Conv_06_FE_WithReverse ( const nsString aSrc,
nsString aDst,
PRUint32  aDir 
)

Scan an nsString, converting characters in the 06xx range to the equivalent characters in the 0Fxx range (Arabic presentation forms), with the option to reverse the string.

Parameters:
aSrcis the input string
aDstis the output string
aDirindicates whether the string should be reversed IBMBIDI_TEXTDIRECTION_LTR: do not reverse the string IBMBIDI_TEXTDIRECTION_RTL: reverse the string

Definition at line 446 of file nsBidiUtils.cpp.

{
  PRUnichar *aSrcUnichars = (PRUnichar *)aSrc.get();
  PRUint32 i, beginArabic, endArabic, size;
  beginArabic = 0;
  size = aSrc.Length();
  aDst.Truncate();
  PRBool foundArabic = PR_FALSE;
  for (endArabic=0;endArabic<size;endArabic++) {
    if (aSrcUnichars[endArabic] == 0x0000) 
      break; // no need to convert char after the NULL

    while( (IS_06_CHAR(aSrcUnichars[endArabic])) || 
           (IS_ARABIC_CHAR(aSrcUnichars[endArabic])) || 
           (aSrcUnichars[endArabic]==0x0020) || 
           (IS_ARABIC_DIGIT(aSrcUnichars[endArabic]))  ) 
    {
      if(! foundArabic) {
        beginArabic=endArabic;
        foundArabic=PR_TRUE;
      }
      endArabic++;
    }
    if(foundArabic) {
      endArabic--;
      PRUnichar buf[8192];
      PRUint32 len=8192;

      ArabicShaping(&aSrcUnichars[beginArabic], endArabic-beginArabic+1,
                    buf, &len, 
                    PR_TRUE, PR_FALSE);
      // to reverse the numerals
      PRUint32 endNumeral, beginNumeral = 0;
      for (endNumeral=0;endNumeral<=len-1;endNumeral++){
        PRBool foundNumeral = PR_FALSE;
        while((endNumeral < len) && (IS_ARABIC_DIGIT(buf[endNumeral]))  ) {
          if(!foundNumeral)
          {
            foundNumeral=PR_TRUE;
            beginNumeral=endNumeral;
          }
          endNumeral++;
        }
        if(foundNumeral){
          endNumeral--;
          PRUnichar numbuf[20];
          for(i=beginNumeral; i<=endNumeral; i++){
            numbuf[i-beginNumeral]=buf[endNumeral-i+beginNumeral];
          }
          for(i=0;i<=endNumeral-beginNumeral;i++){
            buf[i+beginNumeral]=numbuf[i];
          }
        }
      }
      if(aDir==1){//ltr
        for (i=0;i<=len-1;i++){
          aDst+= buf[i];
        } 
      }
      else if(aDir==2){//rtl
        for (i=0;i<=len-1;i++){
          aDst+= buf[len-1-i];
        } 
      }
    } else {
      aDst += aSrcUnichars[endArabic];
    }
    foundArabic=PR_FALSE;
  }// for : loop the buffer
  return NS_OK;
}

Here is the call graph for this function:

Here is the caller graph for this function:

nsresult Conv_FE_06 ( const nsString aSrc,
nsString aDst 
)

Scan an nsString, converting characters in the FExx range (Arabic presentation forms) to the equivalent characters in the 06xx range.

Parameters:
aSrcis the input string
aDstis the output string

Definition at line 372 of file nsBidiUtils.cpp.

{
  PRUnichar *aSrcUnichars = (PRUnichar *)aSrc.get();
  PRUint32 i, size = aSrc.Length();
  aDst.Truncate();
  for (i=0;i<size;i++) { // i : Source
    if (aSrcUnichars[i] == 0x0000) 
      break; // no need to convert char after the NULL
    if (IS_FE_CHAR(aSrcUnichars[i])) {
      //ahmed for lamalf
      PRUnichar ch = (PresentationToOriginal(aSrcUnichars[i], 1));
      if(ch)
        aDst += ch;
      ch=(PresentationToOriginal(aSrcUnichars[i], 0));
      if(ch)
        aDst += ch;
      else //if it is 00, just output what we have in FExx
        aDst += aSrcUnichars[i];
    } else {
      aDst += aSrcUnichars[i]; // copy it even if it is not in FE range
    }
  }// for : loop the buffer
  return NS_OK;
}

Here is the call graph for this function:

Here is the caller graph for this function:

Scan an nsString, converting characters in the FExx range (Arabic presentation forms) to the equivalent characters in the 06xx range, and also reverse the string.

Parameters:
aSrcis the input string
aDstis the output string

Definition at line 397 of file nsBidiUtils.cpp.

{
  PRUnichar *aSrcUnichars = (PRUnichar *)aSrc.get();
  PRBool foundArabic = PR_FALSE;
  PRUint32 i, endArabic, beginArabic, size;
  beginArabic = 0;
  size = aSrc.Length();
  aDst.Truncate();
  for (endArabic=0;endArabic<size;endArabic++) {
    if (aSrcUnichars[endArabic] == 0x0000) 
      break; // no need to convert char after the NULL

    while( (IS_FE_CHAR(aSrcUnichars[endArabic]))||
           (IS_ARABIC_CHAR(aSrcUnichars[endArabic]))||
           (IS_ARABIC_DIGIT(aSrcUnichars[endArabic]))||
           (aSrcUnichars[endArabic]==0x0020)) 
    {
      if(! foundArabic ) {
        beginArabic=endArabic;
        foundArabic= PR_TRUE;
      }
      endArabic++;
    }
    if(foundArabic) {
      endArabic--;
      for (i=endArabic; i>=beginArabic; i--) {
        if(IS_FE_CHAR(aSrcUnichars[i])) {
          //ahmed for the bug of lamalf
          aDst += PresentationToOriginal(aSrcUnichars[i], 0);
          if (PresentationToOriginal(aSrcUnichars[i], 1)) {
            // Two characters, we have to resize the buffer :(
             aDst += PresentationToOriginal(aSrcUnichars[i], 1);
          } // if expands to 2 char
        } else {
          // do we need to check the following if ?
          if((IS_ARABIC_CHAR(aSrcUnichars[i]))||
             (IS_ARABIC_DIGIT(aSrcUnichars[i]))||
             (aSrcUnichars[i]==0x0020))
            aDst += aSrcUnichars[i];
        }     
      }
    } else {
      aDst += aSrcUnichars[endArabic]; 
    }
    foundArabic=PR_FALSE;
  }// for : loop the buffer
  return NS_OK;
}

Here is the call graph for this function:

nsresult HandleNumbers ( PRUnichar aBuffer,
PRUint32  aSize,
PRUint32  aNumFlag 
)

Scan a Unichar string, converting numbers to Arabic or Hindi forms in place.

Parameters:
aBufferis the string
aSizeis the size of aBuffer
aNumFlagspecifies the conversion to perform: IBMBIDI_NUMERAL_NOMINAL: don't do any conversion IBMBIDI_NUMERAL_HINDI: convert to Hindi forms (Unicode 0660-0669) IBMBIDI_NUMERAL_ARABIC: convert to Arabic forms (Unicode 0030-0039) IBMBIDI_NUMERAL_HINDICONTEXT: convert numbers in Arabic text to Hindi, otherwise to Arabic

Definition at line 520 of file nsBidiUtils.cpp.

{
  PRUint32 i;
  // IBMBIDI_NUMERAL_NOMINAL *
  // IBMBIDI_NUMERAL_REGULAR
  // IBMBIDI_NUMERAL_HINDICONTEXT
  // IBMBIDI_NUMERAL_ARABIC
  // IBMBIDI_NUMERAL_HINDI

  switch (aNumFlag) {
    case IBMBIDI_NUMERAL_HINDI:
      for (i=0;i<aSize;i++)
        aBuffer[i] = NUM_TO_HINDI(aBuffer[i]);
      break;
    case IBMBIDI_NUMERAL_ARABIC:
      for (i=0;i<aSize;i++)
        aBuffer[i] = NUM_TO_ARABIC(aBuffer[i]);
      break;
    case IBMBIDI_NUMERAL_REGULAR:
    case IBMBIDI_NUMERAL_HINDICONTEXT:
        // for clipboard handling
        //XXX do we really want to convert numerals when copying text?
      for (i=1;i<aSize;i++) {
        if (IS_ARABIC_CHAR(aBuffer[i-1])) 
          aBuffer[i] = NUM_TO_HINDI(aBuffer[i]);
        else 
          aBuffer[i] = NUM_TO_ARABIC(aBuffer[i]);
      }
    case IBMBIDI_NUMERAL_NOMINAL:
    default:
      break;
  }
  return NS_OK;
}

Here is the caller graph for this function:

nsresult HandleNumbers ( const nsString aSrc,
nsString aDst 
)

Scan an nsString, converting numerals to Arabic or Hindi forms.

Parameters:
aSrcis the input string
aDstis the output string

Definition at line 555 of file nsBidiUtils.cpp.

{
  aDst = aSrc;
  return HandleNumbers((PRUnichar *)aDst.get(),aDst.Length(), IBMBIDI_NUMERAL_REGULAR);
}

Here is the call graph for this function:

static void ReverseString ( PRUnichar aBuffer,
PRUint32  aLen 
) [static]

Definition at line 263 of file nsBidiUtils.cpp.

{
  PRUnichar *start, *end;
  PRUnichar swapChar;

  for (start = aBuffer, end = aBuffer + aLen - 1; start < end; ++start, --end) {
    swapChar = *start;
    *start = *end;
    *end = swapChar;
  }
}

Here is the caller graph for this function:


Variable Documentation

const PRUnichar FB_TO_06[] [static]
Initial value:
 {
    0x0671,0x0671,0x067B,0x067B,0x067B,0x067B,0x067E,0x067E, 
    0x067E,0x067E,0x0680,0x0680,0x0680,0x0680,0x067A,0x067A, 
    0x067A,0x067A,0x067F,0x067F,0x067F,0x067F,0x0679,0x0679, 
    0x0679,0x0679,0x06A4,0x06A4,0x06A4,0x06A4,0x06A6,0x06A6, 
    0x06A6,0x06A6,0x0684,0x0684,0x0684,0x0684,0x0683,0x0683, 
    0x0683,0x0683,0x0686,0x0686,0x0686,0x0686,0x0687,0x0687, 
    0x0687,0x0687,0x068D,0x068D,0x068C,0x068C,0x068E,0x068E, 
    0x0688,0x0688,0x0698,0x0698,0x0691,0x0691,0x06A9,0x06A9, 
    0x06A9,0x06A9,0x06AF,0x06AF,0x06AF,0x06AF,0x06B3,0x06B3, 
    0x06B3,0x06B3,0x06B1,0x06B1,0x06B1,0x06B1,0x06BA,0x06BA, 
    0x06BB,0x06BB,0x06BB,0x06BB,0x06C0,0x06C0,0x06C1,0x06C1, 
    0x06C1,0x06C1,0x06BE,0x06BE,0x06BE,0x06BE,0x06D2,0x06D2, 
    0x06D3,0x06D3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 
    0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 
    0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 
    0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 
    0x0000,0x0000,0x0000,0x06AD,0x06AD,0x06AD,0x06AD,0x06C7, 
    0x06C7,0x06C6,0x06C6,0x06C8,0x06C8,0x0677,0x06CB,0x06CB, 
    0x06C5,0x06C5,0x06C9,0x06C9,0x06D0,0x06D0,0x06D0,0x06D0, 
    0x0649,0x0649,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 
    0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 
    0x0000,0x0000,0x0000,0x0000,0x06CC,0x06CC,0x06CC,0x06CC  
}

Definition at line 96 of file nsBidiUtils.cpp.

const PRUnichar FE_TO_06[][2] [static]

Definition at line 46 of file nsBidiUtils.cpp.

Initial value:
 
{
0x82DF, 
0x82E0, 
0x84DF, 
0x84E0, 
0x88DF, 
0x88E0, 
0x8EDF, 
0x8EE0  
}

Definition at line 240 of file nsBidiUtils.cpp.

Initial value:
 {
            0x81, 0x83, 0x85, 0x87, 0x89, 0x8D, 
0x8F, 0x93, 0x95, 0x99, 0x9D, 0xA1, 0xA5, 0xA9, 
0xAB, 0xAD, 0xAF, 0xB1, 0xB5, 0xB9, 0xBD, 0xC1, 
0xC5, 0xC9, 0xCD                                
}

Definition at line 129 of file nsBidiUtils.cpp.

Initial value:
 {
      0xD1, 0xD5, 0xD9, 0xDD, 0xE1, 0xE5, 0xE9, 
0xED, 0xEF, 0xF1                                
}

Definition at line 136 of file nsBidiUtils.cpp.

Initial value:
 {
      0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x66, 0x5E, 0x52, 0x00, 0x00, 0x56, 0x62, 
0x5A, 0x00, 0x00, 0x76, 0x72, 0x00, 0x7A, 0x7E, 
0x88, 0x00, 0x00, 0x00, 0x84, 0x82, 0x86, 0x00, 
0x00, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x8A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x6A, 0x00, 0x6E, 0x00, 
0x00, 0x8E, 0x00, 0x00, 0x00, 0xD3, 0x00, 0x92, 
0x00, 0x9A, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x9E, 0xA0, 0x00, 0x00, 0xAA, 0x00, 
0xA4, 0xA6, 0x00, 0x00, 0x00, 0xE0, 0xD9, 0xD7, 
0xDB, 0xE2, 0x00, 0xDE, 0xFC, 0x00, 0x00, 0x00, 
0xE4, 0x00, 0xAE, 0xB0                          
}

Definition at line 141 of file nsBidiUtils.cpp.

const PRInt8 gJoiningClass[] [static]

Definition at line 200 of file nsBidiUtils.cpp.