Update bidi data tables to Unicode 4.0.1 and add surrogate handling. Bug 240943, r=jshin, sr=rbs.
authorsmontagu@smontagu.org
Thu, 28 Jun 2007 13:02:54 -0700
changeset 2925 bcbd1d4f4b32f8a7b8e2d4d5a7fde584edf958b7
parent 2924 44c1347182f58ac32ca00017ea2ca75857700255
child 2926 a9f91f3e53da6b2ac457ce63a18bdeb3deb33591
push idunknown
push userunknown
push dateunknown
reviewersjshin, rbs
bugs240943
milestone1.9a6pre
Update bidi data tables to Unicode 4.0.1 and add surrogate handling. Bug 240943, r=jshin, sr=rbs.
intl/unicharutil/util/bidicattable.h
intl/unicharutil/util/genbidicattable.pl
intl/unicharutil/util/nsBidiUtils.h
--- a/intl/unicharutil/util/bidicattable.h
+++ b/intl/unicharutil/util/bidicattable.h
@@ -1,25 +1,45 @@
 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
  *
- * The contents of this file are subject to the Mozilla Public License
- * Version 1.1 (the "MPL"); you may not use this file except in
- * compliance with the MPL.  You may obtain a copy of the MPL at
+ * ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
  * http://www.mozilla.org/MPL/
  *
- * Software distributed under the MPL is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the MPL
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  * for the specific language governing rights and limitations under the
- * MPL.
+ * License.
+ *
+ * The Original Code is mozilla.org Code.
+ *
+ * The Initial Developer of the Original Code is
+ * IBM Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 2000
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
  *
- * The Initial Developer of the Original Code is IBM
- * Corporation.  Portions created by IBM are
- * Copyright (C) 2000 IBM Corporation. All
- * Rights Reserved.
- */
+ * Alternatively, the contents of this file may be used under the terms of
+ * either of the GNU General Public License Version 2 or later (the "GPL"),
+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
 /* 
     DO NOT EDIT THIS DOCUMENT !!! THIS DOCUMENT IS GENERATED BY
     mozilla/layout/tools/genbidicattable.pl
  */
 
 
 #include "nscore.h" 
 
@@ -267,24 +287,24 @@ static PRUint8 gBidiCatIdx1[256] = {
       3,  /* U+0780 - U+0787 : 0x33333333 */
       3,  /* U+0788 - U+078F : 0x33333333 */
       3,  /* U+0790 - U+0797 : 0x33333333 */
       3,  /* U+0798 - U+079F : 0x33333333 */
      50,  /* U+07A0 - U+07A7 : 0xAA333333 */
      10,  /* U+07A8 - U+07AF : 0xAAAAAAAA */
      48,  /* U+07B0 - U+07B7 : 0x3333333A */
       3,  /* U+07B8 - U+07BF : 0x33333333 */
-      1,  /* U+07C0 - U+07C7 : 0x11111111 */
-      1,  /* U+07C8 - U+07CF : 0x11111111 */
-      1,  /* U+07D0 - U+07D7 : 0x11111111 */
-      1,  /* U+07D8 - U+07DF : 0x11111111 */
-      1,  /* U+07E0 - U+07E7 : 0x11111111 */
-      1,  /* U+07E8 - U+07EF : 0x11111111 */
-      1,  /* U+07F0 - U+07F7 : 0x11111111 */
-      1,  /* U+07F8 - U+07FF : 0x11111111 */
+      2,  /* U+07C0 - U+07C7 : 0x22222222 */
+      2,  /* U+07C8 - U+07CF : 0x22222222 */
+      2,  /* U+07D0 - U+07D7 : 0x22222222 */
+      2,  /* U+07D8 - U+07DF : 0x22222222 */
+      2,  /* U+07E0 - U+07E7 : 0x22222222 */
+      2,  /* U+07E8 - U+07EF : 0x22222222 */
+      2,  /* U+07F0 - U+07F7 : 0x22222222 */
+      2,  /* U+07F8 - U+07FF : 0x22222222 */
 };
 
 static PRUint8 gBidiCatIdx2[544] = {
      58,  /* U+0900 - U+0907 : 0x11111AA1 */
       1,  /* U+0908 - U+090F : 0x11111111 */
       1,  /* U+0910 - U+0917 : 0x11111111 */
       1,  /* U+0918 - U+091F : 0x11111111 */
       1,  /* U+0920 - U+0927 : 0x11111111 */
@@ -1660,17 +1680,17 @@ static PRUint8 gBidiCatIdx6[160] = {
       1,  /* U+A4D0 - U+A4D7 : 0x11111111 */
       1,  /* U+A4D8 - U+A4DF : 0x11111111 */
       1,  /* U+A4E0 - U+A4E7 : 0x11111111 */
       1,  /* U+A4E8 - U+A4EF : 0x11111111 */
       1,  /* U+A4F0 - U+A4F7 : 0x11111111 */
       1,  /* U+A4F8 - U+A4FF : 0x11111111 */
 };
 
-static PRUint8 gBidiCatIdx7[224] = {
+static PRUint8 gBidiCatIdx7[264] = {
       1,  /* U+F900 - U+F907 : 0x11111111 */
       1,  /* U+F908 - U+F90F : 0x11111111 */
       1,  /* U+F910 - U+F917 : 0x11111111 */
       1,  /* U+F918 - U+F91F : 0x11111111 */
       1,  /* U+F920 - U+F927 : 0x11111111 */
       1,  /* U+F928 - U+F92F : 0x11111111 */
       1,  /* U+F930 - U+F937 : 0x11111111 */
       1,  /* U+F938 - U+F93F : 0x11111111 */
@@ -1815,20 +1835,20 @@ static PRUint8 gBidiCatIdx7[224] = {
       3,  /* U+FD90 - U+FD97 : 0x33333333 */
       3,  /* U+FD98 - U+FD9F : 0x33333333 */
       3,  /* U+FDA0 - U+FDA7 : 0x33333333 */
       3,  /* U+FDA8 - U+FDAF : 0x33333333 */
       3,  /* U+FDB0 - U+FDB7 : 0x33333333 */
       3,  /* U+FDB8 - U+FDBF : 0x33333333 */
       3,  /* U+FDC0 - U+FDC7 : 0x33333333 */
       3,  /* U+FDC8 - U+FDCF : 0x33333333 */
-      3,  /* U+FDD0 - U+FDD7 : 0x33333333 */
-      3,  /* U+FDD8 - U+FDDF : 0x33333333 */
-      3,  /* U+FDE0 - U+FDE7 : 0x33333333 */
-      3,  /* U+FDE8 - U+FDEF : 0x33333333 */
+      1,  /* U+FDD0 - U+FDD7 : 0x11111111 */
+      1,  /* U+FDD8 - U+FDDF : 0x11111111 */
+      1,  /* U+FDE0 - U+FDE7 : 0x11111111 */
+      1,  /* U+FDE8 - U+FDEF : 0x11111111 */
       3,  /* U+FDF0 - U+FDF7 : 0x33333333 */
     145,  /* U+FDF8 - U+FDFF : 0x33933333 */
      10,  /* U+FE00 - U+FE07 : 0xAAAAAAAA */
      10,  /* U+FE08 - U+FE0F : 0xAAAAAAAA */
       1,  /* U+FE10 - U+FE17 : 0x11111111 */
       1,  /* U+FE18 - U+FE1F : 0x11111111 */
      97,  /* U+FE20 - U+FE27 : 0x1111AAAA */
       1,  /* U+FE28 - U+FE2F : 0x11111111 */
@@ -1885,19 +1905,505 @@ static PRUint8 gBidiCatIdx7[224] = {
       1,  /* U+FFC0 - U+FFC7 : 0x11111111 */
       1,  /* U+FFC8 - U+FFCF : 0x11111111 */
       1,  /* U+FFD0 - U+FFD7 : 0x11111111 */
       1,  /* U+FFD8 - U+FFDF : 0x11111111 */
     152,  /* U+FFE0 - U+FFE7 : 0x17799977 */
     127,  /* U+FFE8 - U+FFEF : 0x19999999 */
       1,  /* U+FFF0 - U+FFF7 : 0x11111111 */
     153,  /* U+FFF8 - U+FFFF : 0x11999991 */
+      1,  /* U+10000 - U+10007 : 0x11111111 */
+      1,  /* U+10008 - U+1000F : 0x11111111 */
+      1,  /* U+10010 - U+10017 : 0x11111111 */
+      1,  /* U+10018 - U+1001F : 0x11111111 */
+      1,  /* U+10020 - U+10027 : 0x11111111 */
+      1,  /* U+10028 - U+1002F : 0x11111111 */
+      1,  /* U+10030 - U+10037 : 0x11111111 */
+      1,  /* U+10038 - U+1003F : 0x11111111 */
+      1,  /* U+10040 - U+10047 : 0x11111111 */
+      1,  /* U+10048 - U+1004F : 0x11111111 */
+      1,  /* U+10050 - U+10057 : 0x11111111 */
+      1,  /* U+10058 - U+1005F : 0x11111111 */
+      1,  /* U+10060 - U+10067 : 0x11111111 */
+      1,  /* U+10068 - U+1006F : 0x11111111 */
+      1,  /* U+10070 - U+10077 : 0x11111111 */
+      1,  /* U+10078 - U+1007F : 0x11111111 */
+      1,  /* U+10080 - U+10087 : 0x11111111 */
+      1,  /* U+10088 - U+1008F : 0x11111111 */
+      1,  /* U+10090 - U+10097 : 0x11111111 */
+      1,  /* U+10098 - U+1009F : 0x11111111 */
+      1,  /* U+100A0 - U+100A7 : 0x11111111 */
+      1,  /* U+100A8 - U+100AF : 0x11111111 */
+      1,  /* U+100B0 - U+100B7 : 0x11111111 */
+      1,  /* U+100B8 - U+100BF : 0x11111111 */
+      1,  /* U+100C0 - U+100C7 : 0x11111111 */
+      1,  /* U+100C8 - U+100CF : 0x11111111 */
+      1,  /* U+100D0 - U+100D7 : 0x11111111 */
+      1,  /* U+100D8 - U+100DF : 0x11111111 */
+      1,  /* U+100E0 - U+100E7 : 0x11111111 */
+      1,  /* U+100E8 - U+100EF : 0x11111111 */
+      1,  /* U+100F0 - U+100F7 : 0x11111111 */
+      1,  /* U+100F8 - U+100FF : 0x11111111 */
+    154,  /* U+10100 - U+10107 : 0x11111191 */
+      1,  /* U+10108 - U+1010F : 0x11111111 */
+      1,  /* U+10110 - U+10117 : 0x11111111 */
+      1,  /* U+10118 - U+1011F : 0x11111111 */
+      1,  /* U+10120 - U+10127 : 0x11111111 */
+      1,  /* U+10128 - U+1012F : 0x11111111 */
+      1,  /* U+10130 - U+10137 : 0x11111111 */
+      1,  /* U+10138 - U+1013F : 0x11111111 */
+};
+
+static PRUint8 gBidiCatIdx8[64] = {
+      1,  /* U+10300 - U+10307 : 0x11111111 */
+      1,  /* U+10308 - U+1030F : 0x11111111 */
+      1,  /* U+10310 - U+10317 : 0x11111111 */
+      1,  /* U+10318 - U+1031F : 0x11111111 */
+      1,  /* U+10320 - U+10327 : 0x11111111 */
+      1,  /* U+10328 - U+1032F : 0x11111111 */
+      1,  /* U+10330 - U+10337 : 0x11111111 */
+      1,  /* U+10338 - U+1033F : 0x11111111 */
+      1,  /* U+10340 - U+10347 : 0x11111111 */
+      1,  /* U+10348 - U+1034F : 0x11111111 */
+      1,  /* U+10350 - U+10357 : 0x11111111 */
+      1,  /* U+10358 - U+1035F : 0x11111111 */
+      1,  /* U+10360 - U+10367 : 0x11111111 */
+      1,  /* U+10368 - U+1036F : 0x11111111 */
+      1,  /* U+10370 - U+10377 : 0x11111111 */
+      1,  /* U+10378 - U+1037F : 0x11111111 */
+      1,  /* U+10380 - U+10387 : 0x11111111 */
+      1,  /* U+10388 - U+1038F : 0x11111111 */
+      1,  /* U+10390 - U+10397 : 0x11111111 */
+      1,  /* U+10398 - U+1039F : 0x11111111 */
+      1,  /* U+103A0 - U+103A7 : 0x11111111 */
+      1,  /* U+103A8 - U+103AF : 0x11111111 */
+      1,  /* U+103B0 - U+103B7 : 0x11111111 */
+      1,  /* U+103B8 - U+103BF : 0x11111111 */
+      1,  /* U+103C0 - U+103C7 : 0x11111111 */
+      1,  /* U+103C8 - U+103CF : 0x11111111 */
+      1,  /* U+103D0 - U+103D7 : 0x11111111 */
+      1,  /* U+103D8 - U+103DF : 0x11111111 */
+      1,  /* U+103E0 - U+103E7 : 0x11111111 */
+      1,  /* U+103E8 - U+103EF : 0x11111111 */
+      1,  /* U+103F0 - U+103F7 : 0x11111111 */
+      1,  /* U+103F8 - U+103FF : 0x11111111 */
+      1,  /* U+10400 - U+10407 : 0x11111111 */
+      1,  /* U+10408 - U+1040F : 0x11111111 */
+      1,  /* U+10410 - U+10417 : 0x11111111 */
+      1,  /* U+10418 - U+1041F : 0x11111111 */
+      1,  /* U+10420 - U+10427 : 0x11111111 */
+      1,  /* U+10428 - U+1042F : 0x11111111 */
+      1,  /* U+10430 - U+10437 : 0x11111111 */
+      1,  /* U+10438 - U+1043F : 0x11111111 */
+      1,  /* U+10440 - U+10447 : 0x11111111 */
+      1,  /* U+10448 - U+1044F : 0x11111111 */
+      1,  /* U+10450 - U+10457 : 0x11111111 */
+      1,  /* U+10458 - U+1045F : 0x11111111 */
+      1,  /* U+10460 - U+10467 : 0x11111111 */
+      1,  /* U+10468 - U+1046F : 0x11111111 */
+      1,  /* U+10470 - U+10477 : 0x11111111 */
+      1,  /* U+10478 - U+1047F : 0x11111111 */
+      1,  /* U+10480 - U+10487 : 0x11111111 */
+      1,  /* U+10488 - U+1048F : 0x11111111 */
+      1,  /* U+10490 - U+10497 : 0x11111111 */
+      1,  /* U+10498 - U+1049F : 0x11111111 */
+      1,  /* U+104A0 - U+104A7 : 0x11111111 */
+      1,  /* U+104A8 - U+104AF : 0x11111111 */
+      1,  /* U+104B0 - U+104B7 : 0x11111111 */
+      1,  /* U+104B8 - U+104BF : 0x11111111 */
+      1,  /* U+104C0 - U+104C7 : 0x11111111 */
+      1,  /* U+104C8 - U+104CF : 0x11111111 */
+      1,  /* U+104D0 - U+104D7 : 0x11111111 */
+      1,  /* U+104D8 - U+104DF : 0x11111111 */
+      1,  /* U+104E0 - U+104E7 : 0x11111111 */
+      1,  /* U+104E8 - U+104EF : 0x11111111 */
+      1,  /* U+104F0 - U+104F7 : 0x11111111 */
+      1,  /* U+104F8 - U+104FF : 0x11111111 */
+};
+
+static PRUint8 gBidiCatIdx9[8] = {
+      2,  /* U+10800 - U+10807 : 0x22222222 */
+      2,  /* U+10808 - U+1080F : 0x22222222 */
+      2,  /* U+10810 - U+10817 : 0x22222222 */
+      2,  /* U+10818 - U+1081F : 0x22222222 */
+      2,  /* U+10820 - U+10827 : 0x22222222 */
+      2,  /* U+10828 - U+1082F : 0x22222222 */
+      2,  /* U+10830 - U+10837 : 0x22222222 */
+      2,  /* U+10838 - U+1083F : 0x22222222 */
+};
+
+static PRUint8 gBidiCatIdx10[64] = {
+      1,  /* U+1D000 - U+1D007 : 0x11111111 */
+      1,  /* U+1D008 - U+1D00F : 0x11111111 */
+      1,  /* U+1D010 - U+1D017 : 0x11111111 */
+      1,  /* U+1D018 - U+1D01F : 0x11111111 */
+      1,  /* U+1D020 - U+1D027 : 0x11111111 */
+      1,  /* U+1D028 - U+1D02F : 0x11111111 */
+      1,  /* U+1D030 - U+1D037 : 0x11111111 */
+      1,  /* U+1D038 - U+1D03F : 0x11111111 */
+      1,  /* U+1D040 - U+1D047 : 0x11111111 */
+      1,  /* U+1D048 - U+1D04F : 0x11111111 */
+      1,  /* U+1D050 - U+1D057 : 0x11111111 */
+      1,  /* U+1D058 - U+1D05F : 0x11111111 */
+      1,  /* U+1D060 - U+1D067 : 0x11111111 */
+      1,  /* U+1D068 - U+1D06F : 0x11111111 */
+      1,  /* U+1D070 - U+1D077 : 0x11111111 */
+      1,  /* U+1D078 - U+1D07F : 0x11111111 */
+      1,  /* U+1D080 - U+1D087 : 0x11111111 */
+      1,  /* U+1D088 - U+1D08F : 0x11111111 */
+      1,  /* U+1D090 - U+1D097 : 0x11111111 */
+      1,  /* U+1D098 - U+1D09F : 0x11111111 */
+      1,  /* U+1D0A0 - U+1D0A7 : 0x11111111 */
+      1,  /* U+1D0A8 - U+1D0AF : 0x11111111 */
+      1,  /* U+1D0B0 - U+1D0B7 : 0x11111111 */
+      1,  /* U+1D0B8 - U+1D0BF : 0x11111111 */
+      1,  /* U+1D0C0 - U+1D0C7 : 0x11111111 */
+      1,  /* U+1D0C8 - U+1D0CF : 0x11111111 */
+      1,  /* U+1D0D0 - U+1D0D7 : 0x11111111 */
+      1,  /* U+1D0D8 - U+1D0DF : 0x11111111 */
+      1,  /* U+1D0E0 - U+1D0E7 : 0x11111111 */
+      1,  /* U+1D0E8 - U+1D0EF : 0x11111111 */
+      1,  /* U+1D0F0 - U+1D0F7 : 0x11111111 */
+      1,  /* U+1D0F8 - U+1D0FF : 0x11111111 */
+      1,  /* U+1D100 - U+1D107 : 0x11111111 */
+      1,  /* U+1D108 - U+1D10F : 0x11111111 */
+      1,  /* U+1D110 - U+1D117 : 0x11111111 */
+      1,  /* U+1D118 - U+1D11F : 0x11111111 */
+      1,  /* U+1D120 - U+1D127 : 0x11111111 */
+      1,  /* U+1D128 - U+1D12F : 0x11111111 */
+      1,  /* U+1D130 - U+1D137 : 0x11111111 */
+      1,  /* U+1D138 - U+1D13F : 0x11111111 */
+      1,  /* U+1D140 - U+1D147 : 0x11111111 */
+      1,  /* U+1D148 - U+1D14F : 0x11111111 */
+      1,  /* U+1D150 - U+1D157 : 0x11111111 */
+      1,  /* U+1D158 - U+1D15F : 0x11111111 */
+     85,  /* U+1D160 - U+1D167 : 0xA1111111 */
+     39,  /* U+1D168 - U+1D16F : 0x111111AA */
+    155,  /* U+1D170 - U+1D177 : 0xBBBBB111 */
+    156,  /* U+1D178 - U+1D17F : 0xAAAAABBB */
+    157,  /* U+1D180 - U+1D187 : 0xAAA11AAA */
+     97,  /* U+1D188 - U+1D18F : 0x1111AAAA */
+      1,  /* U+1D190 - U+1D197 : 0x11111111 */
+      1,  /* U+1D198 - U+1D19F : 0x11111111 */
+      1,  /* U+1D1A0 - U+1D1A7 : 0x11111111 */
+    158,  /* U+1D1A8 - U+1D1AF : 0x11AAAA11 */
+      1,  /* U+1D1B0 - U+1D1B7 : 0x11111111 */
+      1,  /* U+1D1B8 - U+1D1BF : 0x11111111 */
+      1,  /* U+1D1C0 - U+1D1C7 : 0x11111111 */
+      1,  /* U+1D1C8 - U+1D1CF : 0x11111111 */
+      1,  /* U+1D1D0 - U+1D1D7 : 0x11111111 */
+      1,  /* U+1D1D8 - U+1D1DF : 0x11111111 */
+      1,  /* U+1D1E0 - U+1D1E7 : 0x11111111 */
+      1,  /* U+1D1E8 - U+1D1EF : 0x11111111 */
+      1,  /* U+1D1F0 - U+1D1F7 : 0x11111111 */
+      1,  /* U+1D1F8 - U+1D1FF : 0x11111111 */
 };
 
-static PRUint32 gBidiCatPat[154] = {
+static PRUint8 gBidiCatIdx11[160] = {
+      9,  /* U+1D300 - U+1D307 : 0x99999999 */
+      9,  /* U+1D308 - U+1D30F : 0x99999999 */
+      9,  /* U+1D310 - U+1D317 : 0x99999999 */
+      9,  /* U+1D318 - U+1D31F : 0x99999999 */
+      9,  /* U+1D320 - U+1D327 : 0x99999999 */
+      9,  /* U+1D328 - U+1D32F : 0x99999999 */
+      9,  /* U+1D330 - U+1D337 : 0x99999999 */
+      9,  /* U+1D338 - U+1D33F : 0x99999999 */
+      9,  /* U+1D340 - U+1D347 : 0x99999999 */
+      9,  /* U+1D348 - U+1D34F : 0x99999999 */
+    127,  /* U+1D350 - U+1D357 : 0x19999999 */
+      1,  /* U+1D358 - U+1D35F : 0x11111111 */
+      1,  /* U+1D360 - U+1D367 : 0x11111111 */
+      1,  /* U+1D368 - U+1D36F : 0x11111111 */
+      1,  /* U+1D370 - U+1D377 : 0x11111111 */
+      1,  /* U+1D378 - U+1D37F : 0x11111111 */
+      1,  /* U+1D380 - U+1D387 : 0x11111111 */
+      1,  /* U+1D388 - U+1D38F : 0x11111111 */
+      1,  /* U+1D390 - U+1D397 : 0x11111111 */
+      1,  /* U+1D398 - U+1D39F : 0x11111111 */
+      1,  /* U+1D3A0 - U+1D3A7 : 0x11111111 */
+      1,  /* U+1D3A8 - U+1D3AF : 0x11111111 */
+      1,  /* U+1D3B0 - U+1D3B7 : 0x11111111 */
+      1,  /* U+1D3B8 - U+1D3BF : 0x11111111 */
+      1,  /* U+1D3C0 - U+1D3C7 : 0x11111111 */
+      1,  /* U+1D3C8 - U+1D3CF : 0x11111111 */
+      1,  /* U+1D3D0 - U+1D3D7 : 0x11111111 */
+      1,  /* U+1D3D8 - U+1D3DF : 0x11111111 */
+      1,  /* U+1D3E0 - U+1D3E7 : 0x11111111 */
+      1,  /* U+1D3E8 - U+1D3EF : 0x11111111 */
+      1,  /* U+1D3F0 - U+1D3F7 : 0x11111111 */
+      1,  /* U+1D3F8 - U+1D3FF : 0x11111111 */
+      1,  /* U+1D400 - U+1D407 : 0x11111111 */
+      1,  /* U+1D408 - U+1D40F : 0x11111111 */
+      1,  /* U+1D410 - U+1D417 : 0x11111111 */
+      1,  /* U+1D418 - U+1D41F : 0x11111111 */
+      1,  /* U+1D420 - U+1D427 : 0x11111111 */
+      1,  /* U+1D428 - U+1D42F : 0x11111111 */
+      1,  /* U+1D430 - U+1D437 : 0x11111111 */
+      1,  /* U+1D438 - U+1D43F : 0x11111111 */
+      1,  /* U+1D440 - U+1D447 : 0x11111111 */
+      1,  /* U+1D448 - U+1D44F : 0x11111111 */
+      1,  /* U+1D450 - U+1D457 : 0x11111111 */
+      1,  /* U+1D458 - U+1D45F : 0x11111111 */
+      1,  /* U+1D460 - U+1D467 : 0x11111111 */
+      1,  /* U+1D468 - U+1D46F : 0x11111111 */
+      1,  /* U+1D470 - U+1D477 : 0x11111111 */
+      1,  /* U+1D478 - U+1D47F : 0x11111111 */
+      1,  /* U+1D480 - U+1D487 : 0x11111111 */
+      1,  /* U+1D488 - U+1D48F : 0x11111111 */
+      1,  /* U+1D490 - U+1D497 : 0x11111111 */
+      1,  /* U+1D498 - U+1D49F : 0x11111111 */
+      1,  /* U+1D4A0 - U+1D4A7 : 0x11111111 */
+      1,  /* U+1D4A8 - U+1D4AF : 0x11111111 */
+      1,  /* U+1D4B0 - U+1D4B7 : 0x11111111 */
+      1,  /* U+1D4B8 - U+1D4BF : 0x11111111 */
+      1,  /* U+1D4C0 - U+1D4C7 : 0x11111111 */
+      1,  /* U+1D4C8 - U+1D4CF : 0x11111111 */
+      1,  /* U+1D4D0 - U+1D4D7 : 0x11111111 */
+      1,  /* U+1D4D8 - U+1D4DF : 0x11111111 */
+      1,  /* U+1D4E0 - U+1D4E7 : 0x11111111 */
+      1,  /* U+1D4E8 - U+1D4EF : 0x11111111 */
+      1,  /* U+1D4F0 - U+1D4F7 : 0x11111111 */
+      1,  /* U+1D4F8 - U+1D4FF : 0x11111111 */
+      1,  /* U+1D500 - U+1D507 : 0x11111111 */
+      1,  /* U+1D508 - U+1D50F : 0x11111111 */
+      1,  /* U+1D510 - U+1D517 : 0x11111111 */
+      1,  /* U+1D518 - U+1D51F : 0x11111111 */
+      1,  /* U+1D520 - U+1D527 : 0x11111111 */
+      1,  /* U+1D528 - U+1D52F : 0x11111111 */
+      1,  /* U+1D530 - U+1D537 : 0x11111111 */
+      1,  /* U+1D538 - U+1D53F : 0x11111111 */
+      1,  /* U+1D540 - U+1D547 : 0x11111111 */
+      1,  /* U+1D548 - U+1D54F : 0x11111111 */
+      1,  /* U+1D550 - U+1D557 : 0x11111111 */
+      1,  /* U+1D558 - U+1D55F : 0x11111111 */
+      1,  /* U+1D560 - U+1D567 : 0x11111111 */
+      1,  /* U+1D568 - U+1D56F : 0x11111111 */
+      1,  /* U+1D570 - U+1D577 : 0x11111111 */
+      1,  /* U+1D578 - U+1D57F : 0x11111111 */
+      1,  /* U+1D580 - U+1D587 : 0x11111111 */
+      1,  /* U+1D588 - U+1D58F : 0x11111111 */
+      1,  /* U+1D590 - U+1D597 : 0x11111111 */
+      1,  /* U+1D598 - U+1D59F : 0x11111111 */
+      1,  /* U+1D5A0 - U+1D5A7 : 0x11111111 */
+      1,  /* U+1D5A8 - U+1D5AF : 0x11111111 */
+      1,  /* U+1D5B0 - U+1D5B7 : 0x11111111 */
+      1,  /* U+1D5B8 - U+1D5BF : 0x11111111 */
+      1,  /* U+1D5C0 - U+1D5C7 : 0x11111111 */
+      1,  /* U+1D5C8 - U+1D5CF : 0x11111111 */
+      1,  /* U+1D5D0 - U+1D5D7 : 0x11111111 */
+      1,  /* U+1D5D8 - U+1D5DF : 0x11111111 */
+      1,  /* U+1D5E0 - U+1D5E7 : 0x11111111 */
+      1,  /* U+1D5E8 - U+1D5EF : 0x11111111 */
+      1,  /* U+1D5F0 - U+1D5F7 : 0x11111111 */
+      1,  /* U+1D5F8 - U+1D5FF : 0x11111111 */
+      1,  /* U+1D600 - U+1D607 : 0x11111111 */
+      1,  /* U+1D608 - U+1D60F : 0x11111111 */
+      1,  /* U+1D610 - U+1D617 : 0x11111111 */
+      1,  /* U+1D618 - U+1D61F : 0x11111111 */
+      1,  /* U+1D620 - U+1D627 : 0x11111111 */
+      1,  /* U+1D628 - U+1D62F : 0x11111111 */
+      1,  /* U+1D630 - U+1D637 : 0x11111111 */
+      1,  /* U+1D638 - U+1D63F : 0x11111111 */
+      1,  /* U+1D640 - U+1D647 : 0x11111111 */
+      1,  /* U+1D648 - U+1D64F : 0x11111111 */
+      1,  /* U+1D650 - U+1D657 : 0x11111111 */
+      1,  /* U+1D658 - U+1D65F : 0x11111111 */
+      1,  /* U+1D660 - U+1D667 : 0x11111111 */
+      1,  /* U+1D668 - U+1D66F : 0x11111111 */
+      1,  /* U+1D670 - U+1D677 : 0x11111111 */
+      1,  /* U+1D678 - U+1D67F : 0x11111111 */
+      1,  /* U+1D680 - U+1D687 : 0x11111111 */
+      1,  /* U+1D688 - U+1D68F : 0x11111111 */
+      1,  /* U+1D690 - U+1D697 : 0x11111111 */
+      1,  /* U+1D698 - U+1D69F : 0x11111111 */
+      1,  /* U+1D6A0 - U+1D6A7 : 0x11111111 */
+      1,  /* U+1D6A8 - U+1D6AF : 0x11111111 */
+      1,  /* U+1D6B0 - U+1D6B7 : 0x11111111 */
+      1,  /* U+1D6B8 - U+1D6BF : 0x11111111 */
+      1,  /* U+1D6C0 - U+1D6C7 : 0x11111111 */
+      1,  /* U+1D6C8 - U+1D6CF : 0x11111111 */
+      1,  /* U+1D6D0 - U+1D6D7 : 0x11111111 */
+      1,  /* U+1D6D8 - U+1D6DF : 0x11111111 */
+      1,  /* U+1D6E0 - U+1D6E7 : 0x11111111 */
+      1,  /* U+1D6E8 - U+1D6EF : 0x11111111 */
+      1,  /* U+1D6F0 - U+1D6F7 : 0x11111111 */
+      1,  /* U+1D6F8 - U+1D6FF : 0x11111111 */
+      1,  /* U+1D700 - U+1D707 : 0x11111111 */
+      1,  /* U+1D708 - U+1D70F : 0x11111111 */
+      1,  /* U+1D710 - U+1D717 : 0x11111111 */
+      1,  /* U+1D718 - U+1D71F : 0x11111111 */
+      1,  /* U+1D720 - U+1D727 : 0x11111111 */
+      1,  /* U+1D728 - U+1D72F : 0x11111111 */
+      1,  /* U+1D730 - U+1D737 : 0x11111111 */
+      1,  /* U+1D738 - U+1D73F : 0x11111111 */
+      1,  /* U+1D740 - U+1D747 : 0x11111111 */
+      1,  /* U+1D748 - U+1D74F : 0x11111111 */
+      1,  /* U+1D750 - U+1D757 : 0x11111111 */
+      1,  /* U+1D758 - U+1D75F : 0x11111111 */
+      1,  /* U+1D760 - U+1D767 : 0x11111111 */
+      1,  /* U+1D768 - U+1D76F : 0x11111111 */
+      1,  /* U+1D770 - U+1D777 : 0x11111111 */
+      1,  /* U+1D778 - U+1D77F : 0x11111111 */
+      1,  /* U+1D780 - U+1D787 : 0x11111111 */
+      1,  /* U+1D788 - U+1D78F : 0x11111111 */
+      1,  /* U+1D790 - U+1D797 : 0x11111111 */
+      1,  /* U+1D798 - U+1D79F : 0x11111111 */
+      1,  /* U+1D7A0 - U+1D7A7 : 0x11111111 */
+      1,  /* U+1D7A8 - U+1D7AF : 0x11111111 */
+      1,  /* U+1D7B0 - U+1D7B7 : 0x11111111 */
+      1,  /* U+1D7B8 - U+1D7BF : 0x11111111 */
+      1,  /* U+1D7C0 - U+1D7C7 : 0x11111111 */
+    159,  /* U+1D7C8 - U+1D7CF : 0x55111111 */
+      5,  /* U+1D7D0 - U+1D7D7 : 0x55555555 */
+      5,  /* U+1D7D8 - U+1D7DF : 0x55555555 */
+      5,  /* U+1D7E0 - U+1D7E7 : 0x55555555 */
+      5,  /* U+1D7E8 - U+1D7EF : 0x55555555 */
+      5,  /* U+1D7F0 - U+1D7F7 : 0x55555555 */
+      5,  /* U+1D7F8 - U+1D7FF : 0x55555555 */
+};
+
+static PRUint8 gBidiCatIdx12[68] = {
+      1,  /* U+2F800 - U+2F807 : 0x11111111 */
+      1,  /* U+2F808 - U+2F80F : 0x11111111 */
+      1,  /* U+2F810 - U+2F817 : 0x11111111 */
+      1,  /* U+2F818 - U+2F81F : 0x11111111 */
+      1,  /* U+2F820 - U+2F827 : 0x11111111 */
+      1,  /* U+2F828 - U+2F82F : 0x11111111 */
+      1,  /* U+2F830 - U+2F837 : 0x11111111 */
+      1,  /* U+2F838 - U+2F83F : 0x11111111 */
+      1,  /* U+2F840 - U+2F847 : 0x11111111 */
+      1,  /* U+2F848 - U+2F84F : 0x11111111 */
+      1,  /* U+2F850 - U+2F857 : 0x11111111 */
+      1,  /* U+2F858 - U+2F85F : 0x11111111 */
+      1,  /* U+2F860 - U+2F867 : 0x11111111 */
+      1,  /* U+2F868 - U+2F86F : 0x11111111 */
+      1,  /* U+2F870 - U+2F877 : 0x11111111 */
+      1,  /* U+2F878 - U+2F87F : 0x11111111 */
+      1,  /* U+2F880 - U+2F887 : 0x11111111 */
+      1,  /* U+2F888 - U+2F88F : 0x11111111 */
+      1,  /* U+2F890 - U+2F897 : 0x11111111 */
+      1,  /* U+2F898 - U+2F89F : 0x11111111 */
+      1,  /* U+2F8A0 - U+2F8A7 : 0x11111111 */
+      1,  /* U+2F8A8 - U+2F8AF : 0x11111111 */
+      1,  /* U+2F8B0 - U+2F8B7 : 0x11111111 */
+      1,  /* U+2F8B8 - U+2F8BF : 0x11111111 */
+      1,  /* U+2F8C0 - U+2F8C7 : 0x11111111 */
+      1,  /* U+2F8C8 - U+2F8CF : 0x11111111 */
+      1,  /* U+2F8D0 - U+2F8D7 : 0x11111111 */
+      1,  /* U+2F8D8 - U+2F8DF : 0x11111111 */
+      1,  /* U+2F8E0 - U+2F8E7 : 0x11111111 */
+      1,  /* U+2F8E8 - U+2F8EF : 0x11111111 */
+      1,  /* U+2F8F0 - U+2F8F7 : 0x11111111 */
+      1,  /* U+2F8F8 - U+2F8FF : 0x11111111 */
+      1,  /* U+2F900 - U+2F907 : 0x11111111 */
+      1,  /* U+2F908 - U+2F90F : 0x11111111 */
+      1,  /* U+2F910 - U+2F917 : 0x11111111 */
+      1,  /* U+2F918 - U+2F91F : 0x11111111 */
+      1,  /* U+2F920 - U+2F927 : 0x11111111 */
+      1,  /* U+2F928 - U+2F92F : 0x11111111 */
+      1,  /* U+2F930 - U+2F937 : 0x11111111 */
+      1,  /* U+2F938 - U+2F93F : 0x11111111 */
+      1,  /* U+2F940 - U+2F947 : 0x11111111 */
+      1,  /* U+2F948 - U+2F94F : 0x11111111 */
+      1,  /* U+2F950 - U+2F957 : 0x11111111 */
+      1,  /* U+2F958 - U+2F95F : 0x11111111 */
+      1,  /* U+2F960 - U+2F967 : 0x11111111 */
+      1,  /* U+2F968 - U+2F96F : 0x11111111 */
+      1,  /* U+2F970 - U+2F977 : 0x11111111 */
+      1,  /* U+2F978 - U+2F97F : 0x11111111 */
+      1,  /* U+2F980 - U+2F987 : 0x11111111 */
+      1,  /* U+2F988 - U+2F98F : 0x11111111 */
+      1,  /* U+2F990 - U+2F997 : 0x11111111 */
+      1,  /* U+2F998 - U+2F99F : 0x11111111 */
+      1,  /* U+2F9A0 - U+2F9A7 : 0x11111111 */
+      1,  /* U+2F9A8 - U+2F9AF : 0x11111111 */
+      1,  /* U+2F9B0 - U+2F9B7 : 0x11111111 */
+      1,  /* U+2F9B8 - U+2F9BF : 0x11111111 */
+      1,  /* U+2F9C0 - U+2F9C7 : 0x11111111 */
+      1,  /* U+2F9C8 - U+2F9CF : 0x11111111 */
+      1,  /* U+2F9D0 - U+2F9D7 : 0x11111111 */
+      1,  /* U+2F9D8 - U+2F9DF : 0x11111111 */
+      1,  /* U+2F9E0 - U+2F9E7 : 0x11111111 */
+      1,  /* U+2F9E8 - U+2F9EF : 0x11111111 */
+      1,  /* U+2F9F0 - U+2F9F7 : 0x11111111 */
+      1,  /* U+2F9F8 - U+2F9FF : 0x11111111 */
+      1,  /* U+2FA00 - U+2FA07 : 0x11111111 */
+      1,  /* U+2FA08 - U+2FA0F : 0x11111111 */
+      1,  /* U+2FA10 - U+2FA17 : 0x11111111 */
+      1,  /* U+2FA18 - U+2FA1F : 0x11111111 */
+};
+
+static PRUint8 gBidiCatIdx13[64] = {
+    160,  /* U+E0000 - U+E0007 : 0x111111B1 */
+      1,  /* U+E0008 - U+E000F : 0x11111111 */
+      1,  /* U+E0010 - U+E0017 : 0x11111111 */
+      1,  /* U+E0018 - U+E001F : 0x11111111 */
+     11,  /* U+E0020 - U+E0027 : 0xBBBBBBBB */
+     11,  /* U+E0028 - U+E002F : 0xBBBBBBBB */
+     11,  /* U+E0030 - U+E0037 : 0xBBBBBBBB */
+     11,  /* U+E0038 - U+E003F : 0xBBBBBBBB */
+     11,  /* U+E0040 - U+E0047 : 0xBBBBBBBB */
+     11,  /* U+E0048 - U+E004F : 0xBBBBBBBB */
+     11,  /* U+E0050 - U+E0057 : 0xBBBBBBBB */
+     11,  /* U+E0058 - U+E005F : 0xBBBBBBBB */
+     11,  /* U+E0060 - U+E0067 : 0xBBBBBBBB */
+     11,  /* U+E0068 - U+E006F : 0xBBBBBBBB */
+     11,  /* U+E0070 - U+E0077 : 0xBBBBBBBB */
+     11,  /* U+E0078 - U+E007F : 0xBBBBBBBB */
+      1,  /* U+E0080 - U+E0087 : 0x11111111 */
+      1,  /* U+E0088 - U+E008F : 0x11111111 */
+      1,  /* U+E0090 - U+E0097 : 0x11111111 */
+      1,  /* U+E0098 - U+E009F : 0x11111111 */
+      1,  /* U+E00A0 - U+E00A7 : 0x11111111 */
+      1,  /* U+E00A8 - U+E00AF : 0x11111111 */
+      1,  /* U+E00B0 - U+E00B7 : 0x11111111 */
+      1,  /* U+E00B8 - U+E00BF : 0x11111111 */
+      1,  /* U+E00C0 - U+E00C7 : 0x11111111 */
+      1,  /* U+E00C8 - U+E00CF : 0x11111111 */
+      1,  /* U+E00D0 - U+E00D7 : 0x11111111 */
+      1,  /* U+E00D8 - U+E00DF : 0x11111111 */
+      1,  /* U+E00E0 - U+E00E7 : 0x11111111 */
+      1,  /* U+E00E8 - U+E00EF : 0x11111111 */
+      1,  /* U+E00F0 - U+E00F7 : 0x11111111 */
+      1,  /* U+E00F8 - U+E00FF : 0x11111111 */
+     10,  /* U+E0100 - U+E0107 : 0xAAAAAAAA */
+     10,  /* U+E0108 - U+E010F : 0xAAAAAAAA */
+     10,  /* U+E0110 - U+E0117 : 0xAAAAAAAA */
+     10,  /* U+E0118 - U+E011F : 0xAAAAAAAA */
+     10,  /* U+E0120 - U+E0127 : 0xAAAAAAAA */
+     10,  /* U+E0128 - U+E012F : 0xAAAAAAAA */
+     10,  /* U+E0130 - U+E0137 : 0xAAAAAAAA */
+     10,  /* U+E0138 - U+E013F : 0xAAAAAAAA */
+     10,  /* U+E0140 - U+E0147 : 0xAAAAAAAA */
+     10,  /* U+E0148 - U+E014F : 0xAAAAAAAA */
+     10,  /* U+E0150 - U+E0157 : 0xAAAAAAAA */
+     10,  /* U+E0158 - U+E015F : 0xAAAAAAAA */
+     10,  /* U+E0160 - U+E0167 : 0xAAAAAAAA */
+     10,  /* U+E0168 - U+E016F : 0xAAAAAAAA */
+     10,  /* U+E0170 - U+E0177 : 0xAAAAAAAA */
+     10,  /* U+E0178 - U+E017F : 0xAAAAAAAA */
+     10,  /* U+E0180 - U+E0187 : 0xAAAAAAAA */
+     10,  /* U+E0188 - U+E018F : 0xAAAAAAAA */
+     10,  /* U+E0190 - U+E0197 : 0xAAAAAAAA */
+     10,  /* U+E0198 - U+E019F : 0xAAAAAAAA */
+     10,  /* U+E01A0 - U+E01A7 : 0xAAAAAAAA */
+     10,  /* U+E01A8 - U+E01AF : 0xAAAAAAAA */
+     10,  /* U+E01B0 - U+E01B7 : 0xAAAAAAAA */
+     10,  /* U+E01B8 - U+E01BF : 0xAAAAAAAA */
+     10,  /* U+E01C0 - U+E01C7 : 0xAAAAAAAA */
+     10,  /* U+E01C8 - U+E01CF : 0xAAAAAAAA */
+     10,  /* U+E01D0 - U+E01D7 : 0xAAAAAAAA */
+     10,  /* U+E01D8 - U+E01DF : 0xAAAAAAAA */
+     10,  /* U+E01E0 - U+E01E7 : 0xAAAAAAAA */
+     10,  /* U+E01E8 - U+E01EF : 0xAAAAAAAA */
+      1,  /* U+E01F0 - U+E01F7 : 0x11111111 */
+      1,  /* U+E01F8 - U+E01FF : 0x11111111 */
+};
+
+static PRUint32 gBidiCatPat[161] = {
     0x00000000,  /* 0 */
     0x11111111,  /* 1 */
     0x22222222,  /* 2 */
     0x33333333,  /* 3 */
     0x44444444,  /* 4 */
     0x55555555,  /* 5 */
     0x66666666,  /* 6 */
     0x77777777,  /* 7 */
@@ -2042,97 +2548,102 @@ static PRUint32 gBidiCatPat[154] = {
     0x99891898,  /* 146 */
     0x79999999,  /* 147 */
     0x19997799,  /* 148 */
     0x11119779,  /* 149 */
     0x99777991,  /* 150 */
     0x68787999,  /* 151 */
     0x17799977,  /* 152 */
     0x11999991,  /* 153 */
+    0x11111191,  /* 154 */
+    0xBBBBB111,  /* 155 */
+    0xAAAAABBB,  /* 156 */
+    0xAAA11AAA,  /* 157 */
+    0x11AAAA11,  /* 158 */
+    0x55111111,  /* 159 */
+    0x111111B1,  /* 160 */
 };
 
-static eBidiCategory GetBidiCat(PRUnichar u)
+static eBidiCategory GetBidiCat(PRUint32 u)
 {
     PRUint32 pat;
     PRUint16 patidx;
 
     /*  Handle blocks which use index table mapping */   
 
     /* Handle U+0000 to U+07FF */
-    if (u<=((PRUnichar)0x07FF)) {
+    if (u<=((PRUint32)0x07FF)) {
         patidx = gBidiCatIdx1 [( u  >> 3 )];
-        if (patidx < 0x10)
-            return (eBidiCategory)patidx;
-        else {
-            pat = gBidiCatPat[patidx];
-            return (eBidiCategory)((pat  >> ((u % 8) * 4)) & 0x0F);
-        }
     }
 
     /* Handle U+0900 to U+19FF */
-    if ((((PRUnichar)0x0900)<=u)&&(u<=((PRUnichar)0x19FF))) {
-        patidx = gBidiCatIdx2 [( (u -(PRUnichar) 0x0900) >> 3 )];
-        if (patidx < 0x10)
-            return (eBidiCategory)patidx;
-        else {
-            pat = gBidiCatPat[patidx];
-            return (eBidiCategory)((pat  >> ((u % 8) * 4)) & 0x0F);
-        }
+    else if ((((PRUint32)0x0900)<=u)&&(u<=((PRUint32)0x19FF))) {
+        patidx = gBidiCatIdx2 [( (u -(PRUint32) 0x0900) >> 3 )];
     }
 
     /* Handle U+1D00 to U+2BFF */
-    if ((((PRUnichar)0x1D00)<=u)&&(u<=((PRUnichar)0x2BFF))) {
-        patidx = gBidiCatIdx3 [( (u -(PRUnichar) 0x1D00) >> 3 )];
-        if (patidx < 0x10)
-            return (eBidiCategory)patidx;
-        else {
-            pat = gBidiCatPat[patidx];
-            return (eBidiCategory)((pat  >> ((u % 8) * 4)) & 0x0F);
-        }
+    else if ((((PRUint32)0x1D00)<=u)&&(u<=((PRUint32)0x2BFF))) {
+        patidx = gBidiCatIdx3 [( (u -(PRUint32) 0x1D00) >> 3 )];
     }
 
     /* Handle U+2E80 to U+33FF */
-    if ((((PRUnichar)0x2E80)<=u)&&(u<=((PRUnichar)0x33FF))) {
-        patidx = gBidiCatIdx4 [( (u -(PRUnichar) 0x2E80) >> 3 )];
-        if (patidx < 0x10)
-            return (eBidiCategory)patidx;
-        else {
-            pat = gBidiCatPat[patidx];
-            return (eBidiCategory)((pat  >> ((u % 8) * 4)) & 0x0F);
-        }
+    else if ((((PRUint32)0x2E80)<=u)&&(u<=((PRUint32)0x33FF))) {
+        patidx = gBidiCatIdx4 [( (u -(PRUint32) 0x2E80) >> 3 )];
     }
 
     /* Handle U+4DC0 to U+4DFF */
-    if ((((PRUnichar)0x4DC0)<=u)&&(u<=((PRUnichar)0x4DFF))) {
-        patidx = gBidiCatIdx5 [( (u -(PRUnichar) 0x4DC0) >> 3 )];
-        if (patidx < 0x10)
-            return (eBidiCategory)patidx;
-        else {
-            pat = gBidiCatPat[patidx];
-            return (eBidiCategory)((pat  >> ((u % 8) * 4)) & 0x0F);
-        }
+    else if ((((PRUint32)0x4DC0)<=u)&&(u<=((PRUint32)0x4DFF))) {
+        patidx = gBidiCatIdx5 [( (u -(PRUint32) 0x4DC0) >> 3 )];
     }
 
     /* Handle U+A000 to U+A4FF */
-    if ((((PRUnichar)0xA000)<=u)&&(u<=((PRUnichar)0xA4FF))) {
-        patidx = gBidiCatIdx6 [( (u -(PRUnichar) 0xA000) >> 3 )];
-        if (patidx < 0x10)
-            return (eBidiCategory)patidx;
-        else {
-            pat = gBidiCatPat[patidx];
-            return (eBidiCategory)((pat  >> ((u % 8) * 4)) & 0x0F);
-        }
+    else if ((((PRUint32)0xA000)<=u)&&(u<=((PRUint32)0xA4FF))) {
+        patidx = gBidiCatIdx6 [( (u -(PRUint32) 0xA000) >> 3 )];
+    }
+
+    /* Handle U+F900 to U+1013F */
+    else if ((((PRUint32)0xF900)<=u)&&(u<=((PRUint32)0x1013F))) {
+        patidx = gBidiCatIdx7 [( (u -(PRUint32) 0xF900) >> 3 )];
+    }
+
+    /* Handle U+10300 to U+104FF */
+    else if ((((PRUint32)0x10300)<=u)&&(u<=((PRUint32)0x104FF))) {
+        patidx = gBidiCatIdx8 [( (u -(PRUint32) 0x10300) >> 3 )];
+    }
+
+    /* Handle U+10800 to U+1083F */
+    else if ((((PRUint32)0x10800)<=u)&&(u<=((PRUint32)0x1083F))) {
+        patidx = gBidiCatIdx9 [( (u -(PRUint32) 0x10800) >> 3 )];
+    }
+
+    /* Handle U+1D000 to U+1D1FF */
+    else if ((((PRUint32)0x1D000)<=u)&&(u<=((PRUint32)0x1D1FF))) {
+        patidx = gBidiCatIdx10 [( (u -(PRUint32) 0x1D000) >> 3 )];
     }
 
-    /* Handle U+F900 to U+FFFF */
-    if (((PRUnichar)0xF900)<=u) {
-        patidx = gBidiCatIdx7 [( (u -(PRUnichar) 0xF900) >> 3 )];
-        if (patidx < 0x10)
-            return (eBidiCategory)patidx;
-        else {
-            pat = gBidiCatPat[patidx];
-            return (eBidiCategory)((pat  >> ((u % 8) * 4)) & 0x0F);
-        }
+    /* Handle U+1D300 to U+1D7FF */
+    else if ((((PRUint32)0x1D300)<=u)&&(u<=((PRUint32)0x1D7FF))) {
+        patidx = gBidiCatIdx11 [( (u -(PRUint32) 0x1D300) >> 3 )];
+    }
+
+    /* Handle U+2F800 to U+2FA1F */
+    else if ((((PRUint32)0x2F800)<=u)&&(u<=((PRUint32)0x2FA1F))) {
+        patidx = gBidiCatIdx12 [( (u -(PRUint32) 0x2F800) >> 3 )];
     }
 
-    return eBidiCat_L; /* UNDEFINE = L */
+    /* Handle U+E0000 to U+E01FF */
+    else if ((((PRUint32)0xE0000)<=u)&&(u<=((PRUint32)0xE01FF))) {
+        patidx = gBidiCatIdx13 [( (u -(PRUint32) 0xE0000) >> 3 )];
+    }
+
+    else {
+        return eBidiCat_L; /* UNDEFINE = L */
+    }
+
+    if (patidx < 0x10)
+        return (eBidiCategory)patidx;
+    else {
+        pat = gBidiCatPat[patidx];
+        return (eBidiCategory)((pat  >> ((u % 8) * 4)) & 0x0F);
+    }
 }
-/* total data size = 2464 */
+
+/* total data size = 2960 */
--- a/intl/unicharutil/util/genbidicattable.pl
+++ b/intl/unicharutil/util/genbidicattable.pl
@@ -88,31 +88,51 @@ open ( OUT , "> ../base/src/bidicattable
 ######################################################################
 #
 # Generate license and header
 #
 ######################################################################
 $npl = <<END_OF_NPL;
 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
  *
- * The contents of this file are subject to the Mozilla Public License
- * Version 1.1 (the "MPL"); you may not use this file except in
- * compliance with the MPL.  You may obtain a copy of the MPL at
+ * ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
  * http://www.mozilla.org/MPL/
  *
- * Software distributed under the MPL is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the MPL
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  * for the specific language governing rights and limitations under the
- * MPL.
+ * License.
+ *
+ * The Original Code is mozilla.org Code.
+ *
+ * The Initial Developer of the Original Code is
+ * IBM Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 2000
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
  *
- * The Initial Developer of the Original Code is IBM
- * Corporation.  Portions created by IBM are
- * Copyright (C) 2000 IBM Corporation. All
- * Rights Reserved.
- */
+ * Alternatively, the contents of this file may be used under the terms of
+ * either of the GNU General Public License Version 2 or later (the "GPL"),
+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
 /* 
     DO NOT EDIT THIS DOCUMENT !!! THIS DOCUMENT IS GENERATED BY
     mozilla/layout/tools/genbidicattable.pl
  */
 END_OF_NPL
 print OUT $npl;
 print OUT "\n\n#include \"nscore.h\" \n\n";
 
@@ -168,22 +188,29 @@ while(<UNICODATA>) {
          print "WARNING !!!! error in handling special block\n\n";
       }
    }
 }
 
 # XXX - How can this be made more flexible as new blocks are added to the UCDB?
 
 @range = (
-  0x0000, 0x07ff, 
-  0x0900, 0x18ff,
-  0x1e00, 0x28ff,
-  0x2e80, 0x33ff,
-  0xa000, 0xa4ff,	  
-  0xf900, 0xffff
+  0x0000,   0x07ff, 
+  0x0900,   0x19ff,
+  0x1d00,   0x2bff,
+  0x2e80,   0x33ff,
+  0x4dc0,   0x4dff,
+  0xa000,   0xa4ff,	  
+  0xf900,  0x1013f,
+  0x10300, 0x104ff,
+  0x10800, 0x1083f,
+  0x1d000, 0x1d1ff,
+  0x1d300, 0x1d7ff,
+  0x2f800, 0x2fa1f,
+  0xe0000, 0xe01ff  
 );
 
 
 $totaldata = 0;
 
 $tt=($#range+1) / 2;
 @patarray = ();
 
@@ -206,25 +233,29 @@ for($t = 1; $t <= $tt; $t++)
 	$totaldata += $ts + 1;
 	printf OUT "static PRUint8 gBidiCatIdx%d[%d] = {\n", $t, $ts + 1;
 	for($i = ($tl >> 3); $i <= ($th >> 3) ; $i ++ )
 	{
       $data = 0;
 		      
 		for($j = 0; $j < 8 ; $j++)
 		{
-			#defaults for unassigned characters -- see table 3.7 in the Unicode Bidi Algorithm
+			#defaults for unassigned characters
+		        #see http://www.unicode.org/Public/UNIDATA/UCD.html#Bidi_Class
 			$test = ($i << 3) + $j;
-			if ((($test >= 0x0590) && ($test <= 0x5FF))
-				  || (($test >= 0xFB1D) && ($test <= 0xFB4F)))
+			if ((($test >= 0x0590) && ($test <= 0x5FF)) ||
+			    (($test >= 0x07C0) && ($test <= 0x8FF)) ||
+			    (($test >= 0xFB1D) && ($test <= 0xFB4F)) ||
+			    (($test >= 0x10800) && ($test <=0x10FFF)))
 			{
 				$default = $map{"R"};
-			} elsif ((($test >= 0x0600) && ($test <= 0x7BF))
-					   || (($test >= 0xFB50) && ($test <= 0xFDFF))
-					   || (($test >= 0xFE70) && ($test <= 0xFEFF)))
+			} elsif ((($test >= 0x0600) && ($test <= 0x7BF)) ||
+				 (($test >= 0xFB50) && ($test <= 0xFDCF)) ||
+				 (($test >= 0xFDF0) && ($test <= 0xFDFF)) ||
+				 (($test >= 0xFE70) && ($test <= 0xFEFE)))
 			{
 				$default = $map{"AL"};
 			} else
 			{
 				$default = $map{"L"};
 			}
 			$k =  sprintf("%04X", (($i << 3) + $j));
 			
@@ -291,65 +322,62 @@ if($newidx > 255)
 printf OUT "static PRUint32 gBidiCatPat[$newidx] = {\n";
 for($i = 0 ; $i < $newidx; $i++)
 {
    printf OUT "    %s,  /* $i */\n", $patarray[$i] ;
 }
 printf OUT "};\n\n";
 $totaldata += $newidx * 4;
 
-printf OUT "static eBidiCategory GetBidiCat(PRUnichar u)\n{\n";
+printf OUT "static eBidiCategory GetBidiCat(PRUint32 u)\n{\n";
 printf OUT "    PRUint32 pat;\n";
 printf OUT "    PRUint16 patidx;\n\n";
-printf OUT "    /*  Handle blocks which use index table mapping */   \n\n";
-for($t = 1; $t <= $tt; $t++)
-{
-   $tl = $range[($t-1) * 2];
-   $th = $range[($t-1) * 2 + 1];
-   if ($tl == 0) {
-	   printf OUT "    /* Handle U+%04X to U+%04X */\n", $tl, $th;
-	   printf OUT "    if (u<=((PRUnichar)0x%04X)) {\n", $th;
-	   printf OUT "        patidx = gBidiCatIdx%d [( u  >> 3 )];\n", $t;
-   } elsif ($th == 0xFFFF) {
-	   printf OUT "    /* Handle U+%04X to U+%04X */\n", $tl, $th;
-	   printf OUT "    if (((PRUnichar)0x%04X)<=u) {\n", $tl;
-	   printf OUT "        patidx = gBidiCatIdx%d [( (u -(PRUnichar) 0x%04X) >> 3 )];\n", $t, $tl;
-   } else {
-	   printf OUT "    /* Handle U+%04X to U+%04X */\n", $tl, $th;
-	   printf OUT "    if ((((PRUnichar)0x%04X)<=u)&&(u<=((PRUnichar)0x%04X))) {\n", $tl, $th;
-	   printf OUT "        patidx = gBidiCatIdx%d [( (u -(PRUnichar) 0x%04X) >> 3 )];\n", $t, $tl;
-   }
-   printf OUT "        if (patidx < 0x10)\n";
-   printf OUT "            return (eBidiCategory)patidx;\n";
-   printf OUT "        else {\n";
-   printf OUT "            pat = gBidiCatPat[patidx];\n";
-   printf OUT "            return (eBidiCategory)((pat  >> ((u % 8) * 4)) & 0x0F);\n";
-   printf OUT "        }\n";
-   printf OUT "    }\n\n";
-}
 
 @special = keys(%sh);
 $sp = 0;
 foreach $s ( sort(@special) ) {
 	# don't bother to define the special blocks unless they have a different
     #  value from the default they would be given if they were undefined
 	unless ($sc{$s} == $map{"L"}) {
 		unless ($sp++) {
 			%by_value = reverse %map;
 			printf OUT "    /*  Handle blocks which share the same category */\n\n";
 		}
 		printf OUT "    /* Handle %s block */\n", substr($s, 1);
-		printf OUT "    if((((PRUnichar)0x%s)<=u)&&(u<=((PRUnichar)0x%s))) \n", $sl{$s}, $sh{$s};
+		printf OUT "    if((((PRUint32)0x%s)<=u)&&(u<=((PRUint32)0x%s))) \n", $sl{$s}, $sh{$s};
 		printf OUT "        return eBidiCat_$by_value{$sc{$s}}; \n\n";
 	}
 }
 
-
+printf OUT "    /*  Handle blocks which use index table mapping */   \n\n";
+for($t = 1; $t <= $tt; $t++)
+{
+   $tl = $range[($t-1) * 2];
+   $th = $range[($t-1) * 2 + 1];
+   if ($tl == 0) {
+	   printf OUT "    /* Handle U+%04X to U+%04X */\n", $tl, $th;
+	   printf OUT "    if (u<=((PRUint32)0x%04X)) {\n", $th;
+	   printf OUT "        patidx = gBidiCatIdx%d [( u  >> 3 )];\n", $t;
+   } else {
+	   printf OUT "    /* Handle U+%04X to U+%04X */\n", $tl, $th;
+	   printf OUT "    else if ((((PRUint32)0x%04X)<=u)&&(u<=((PRUint32)0x%04X))) {\n", $tl, $th;
+	   printf OUT "        patidx = gBidiCatIdx%d [( (u -(PRUint32) 0x%04X) >> 3 )];\n", $t, $tl;
+   }
+   printf OUT "    }\n\n";
+}
+printf OUT "    else {\n";
+printf OUT "        return eBidiCat_L; /* UNDEFINE = L */\n";
+printf OUT "    }\n\n";
 
-printf OUT "    return eBidiCat_L; /* UNDEFINE = L */\n}\n";
+printf OUT "    if (patidx < 0x10)\n";
+printf OUT "        return (eBidiCategory)patidx;\n";
+printf OUT "    else {\n";
+printf OUT "        pat = gBidiCatPat[patidx];\n";
+printf OUT "        return (eBidiCategory)((pat  >> ((u % 8) * 4)) & 0x0F);\n";
+printf OUT "    }\n}\n\n";
 
 printf OUT "/* total data size = $totaldata */\n";
 print "total = $totaldata\n";
 
 ######################################################################
 #
 # Close files
 #
--- a/intl/unicharutil/util/nsBidiUtils.h
+++ b/intl/unicharutil/util/nsBidiUtils.h
@@ -228,12 +228,14 @@
 
 #define IS_HEBREW_CHAR(c) (((0x0590 <= (c)) && ((c)<= 0x05FF)) || (((c) >= 0xfb1d) && ((c) <= 0xfb4f)))
 #define IS_06_CHAR(c) ((0x0600 <= (c)) && ((c)<= 0x06FF))
 #define IS_FE_CHAR(c) (((0xfb50 <= (c)) && ((c)<= 0xfbFF)) \
                        || ((0xfe70 <= (c)) && ((c)<= 0xfeFC)))
 #define IS_ARABIC_CHAR(c) ((0x0600 <= (c)) && ((c)<= 0x06FF))
 #define IS_ARABIC_ALPHABETIC(c) (IS_ARABIC_CHAR(c) && \
                                 !(IS_HINDI_DIGIT(c) || IS_FARSI_DIGIT(c) || IS_ARABIC_SEPARATOR(c)))
+#define IS_CYPRIOT_CHAR(c) ((0x10800 <= (c)) && ((c) <=0x1083F))
 
 #define CHAR_IS_BIDI(c) ( (IS_HINDI_DIGIT(c) ) || (IS_HEBREW_CHAR(c) ) \
-                        || (IS_06_CHAR(c) ) || (IS_FE_CHAR(c) ) )
+                        || (IS_06_CHAR(c) ) || (IS_FE_CHAR(c) ) \
+                        || (IS_CYPRIOT_CHAR(c) ) )
 #endif  /* nsBidiUtils_h__ */