(JC3-70A4): New character.
[chise/xemacs-chise.git-] / src / mule-charset.c
index f670588..6f9b9bc 100644 (file)
@@ -68,6 +68,7 @@ Lisp_Object Vcharset_ucs;
 Lisp_Object Vcharset_ucs_bmp;
 Lisp_Object Vcharset_ucs_smp;
 Lisp_Object Vcharset_ucs_sip;
+Lisp_Object Vcharset_ucs_gb;
 Lisp_Object Vcharset_ucs_cns;
 Lisp_Object Vcharset_ucs_jis;
 Lisp_Object Vcharset_ucs_ks;
@@ -78,7 +79,6 @@ Lisp_Object Vcharset_latin_viscii_lower;
 Lisp_Object Vcharset_latin_viscii_upper;
 Lisp_Object Vcharset_jis_x0208;
 Lisp_Object Vcharset_chinese_big5;
-/* Lisp_Object Vcharset_chinese_big5_cdp; */
 Lisp_Object Vcharset_ideograph_hanziku_1;
 Lisp_Object Vcharset_ideograph_hanziku_2;
 Lisp_Object Vcharset_ideograph_hanziku_3;
@@ -91,8 +91,6 @@ Lisp_Object Vcharset_ideograph_hanziku_9;
 Lisp_Object Vcharset_ideograph_hanziku_10;
 Lisp_Object Vcharset_ideograph_hanziku_11;
 Lisp_Object Vcharset_ideograph_hanziku_12;
-Lisp_Object Vcharset_china3_jef;
-Lisp_Object Vcharset_ideograph_cbeta;
 Lisp_Object Vcharset_ideograph_gt;
 Lisp_Object Vcharset_ideograph_gt_pj_1;
 Lisp_Object Vcharset_ideograph_gt_pj_2;
@@ -131,7 +129,7 @@ struct charset_lookup *chlook;
 static const struct lrecord_description charset_lookup_description_1[] = {
   { XD_LISP_OBJECT_ARRAY, offsetof (struct charset_lookup, charset_by_leading_byte),
 #ifdef UTF2000
-    128+4*128
+    NUM_LEADING_BYTES+4*128
 #else
     128+4*128*2 
 #endif
@@ -340,6 +338,7 @@ Lisp_Object Qascii,
   Qucs_bmp,
   Qucs_smp,
   Qucs_sip,
+  Qucs_gb,
   Qucs_cns,
   Qucs_jis,
   Qucs_ks,
@@ -365,8 +364,6 @@ Lisp_Object Qascii,
   Qideograph_hanziku_10,
   Qideograph_hanziku_11,
   Qideograph_hanziku_12,
-  Qchina3_jef,
-  Qideograph_cbeta,
   Qideograph_daikanwa_2,
   Qideograph_daikanwa,
   Qideograph_gt,
@@ -924,7 +921,7 @@ decode_defined_char (Lisp_Object ccs, int code_point)
     }
   if (CHARP (decoding_table))
     return XCHAR (decoding_table);
-#ifdef HAVE_DATABASE
+#ifdef HAVE_CHISE_CLIENT
   if (EQ (decoding_table, Qunloaded))
     {
       char_id = load_char_decoding_entry_maybe (ccs, code_point);
@@ -974,86 +971,89 @@ decode_builtin_char (Lisp_Object charset, int code_point)
   Lisp_Object mother = XCHARSET_MOTHER (charset);
   int final;
 
-  if ( CHARSETP (mother) && (XCHARSET_MAX_CODE (charset) > 0) )
+  if ( XCHARSET_MAX_CODE (charset) > 0 )
     {
-      int code = code_point;
-
-      if ( XCHARSET_CONVERSION (charset) == CONVERSION_94x60 )
+      if ( CHARSETP (mother) )
        {
-         int row = code_point >> 8;
-         int cell = code_point & 255;    
+         int code = code_point;
 
-         if (row < 16 + 32)
-           return -1;
-         else if (row < 16 + 32 + 30)
-           code = (row - (16 + 32)) * 94 + cell - 33;
-         else if (row < 18 + 32 + 30)
-           return -1;
-         else if (row < 18 + 32 + 60)
-           code = (row - (18 + 32)) * 94 + cell - 33;
-       }
-      else if ( XCHARSET_CONVERSION (charset) == CONVERSION_94x94x60 )
-       {
-         int plane = code_point >> 16;
-         int row = (code_point >> 8) & 255;
-         int cell = code_point & 255;    
+         if ( XCHARSET_CONVERSION (charset) == CONVERSION_94x60 )
+           {
+             int row = code_point >> 8;
+             int cell = code_point & 255;        
 
-         if (row < 16 + 32)
-           return -1;
-         else if (row < 16 + 32 + 30)
-           code
-             = (plane - 33) * 94 * 60
-             + (row - (16 + 32)) * 94
-             + cell - 33;
-         else if (row < 18 + 32 + 30)
-           return -1;
-         else if (row < 18 + 32 + 60)
-           code
-             = (plane - 33) * 94 * 60
-             + (row - (18 + 32)) * 94
-             + cell - 33;
-       }
-      else if ( XCHARSET_CONVERSION (charset) == CONVERSION_BIG5_1 )
-       {
-         unsigned int I
-           = (((code_point >> 8) & 0x7F) - 33) * 94
-           + (( code_point       & 0x7F) - 33);
-         unsigned char b1 = I / (0xFF - 0xA1 + 0x7F - 0x40) + 0xA1;
-         unsigned char b2 = I % (0xFF - 0xA1 + 0x7F - 0x40);
+             if (row < 16 + 32)
+               return -1;
+             else if (row < 16 + 32 + 30)
+               code = (row - (16 + 32)) * 94 + cell - 33;
+             else if (row < 18 + 32 + 30)
+               return -1;
+             else if (row < 18 + 32 + 60)
+               code = (row - (18 + 32)) * 94 + cell - 33;
+           }
+         else if ( XCHARSET_CONVERSION (charset) == CONVERSION_94x94x60 )
+           {
+             int plane = code_point >> 16;
+             int row = (code_point >> 8) & 255;
+             int cell = code_point & 255;        
 
-         b2 += b2 < 0x3F ? 0x40 : 0x62;
-         code = (b1 << 8) | b2;
+             if (row < 16 + 32)
+               return -1;
+             else if (row < 16 + 32 + 30)
+               code
+                 = (plane - 33) * 94 * 60
+                 + (row - (16 + 32)) * 94
+                 + cell - 33;
+             else if (row < 18 + 32 + 30)
+               return -1;
+             else if (row < 18 + 32 + 60)
+               code
+                 = (plane - 33) * 94 * 60
+                 + (row - (18 + 32)) * 94
+                 + cell - 33;
+           }
+         else if ( XCHARSET_CONVERSION (charset) == CONVERSION_BIG5_1 )
+           {
+             unsigned int I
+               = (((code_point >> 8) & 0x7F) - 33) * 94
+               + (( code_point       & 0x7F) - 33);
+             unsigned char b1 = I / (0xFF - 0xA1 + 0x7F - 0x40) + 0xA1;
+             unsigned char b2 = I % (0xFF - 0xA1 + 0x7F - 0x40);
+
+             b2 += b2 < 0x3F ? 0x40 : 0x62;
+             code = (b1 << 8) | b2;
+           }
+         else if ( XCHARSET_CONVERSION (charset) == CONVERSION_BIG5_2 )
+           {
+             unsigned int I
+               = (((code_point >> 8) & 0x7F) - 33) * 94
+               + (( code_point       & 0x7F) - 33)
+               + BIG5_SAME_ROW * (0xC9 - 0xA1);
+             unsigned char b1 = I / (0xFF - 0xA1 + 0x7F - 0x40) + 0xA1;
+             unsigned char b2 = I % (0xFF - 0xA1 + 0x7F - 0x40);
+
+             b2 += b2 < 0x3F ? 0x40 : 0x62;
+             code = (b1 << 8) | b2;
+           }
+         return
+           decode_builtin_char (mother, code + XCHARSET_CODE_OFFSET(charset));
        }
-      else if ( XCHARSET_CONVERSION (charset) == CONVERSION_BIG5_2 )
+      else
        {
-         unsigned int I
-           = (((code_point >> 8) & 0x7F) - 33) * 94
-           + (( code_point       & 0x7F) - 33)
-           + BIG5_SAME_ROW * (0xC9 - 0xA1);
-         unsigned char b1 = I / (0xFF - 0xA1 + 0x7F - 0x40) + 0xA1;
-         unsigned char b2 = I % (0xFF - 0xA1 + 0x7F - 0x40);
-
-         b2 += b2 < 0x3F ? 0x40 : 0x62;
-         code = (b1 << 8) | b2;
+         Emchar cid
+           = (XCHARSET_DIMENSION (charset) == 1
+              ?
+              code_point - XCHARSET_BYTE_OFFSET (charset)
+              :
+              ((code_point >> 8) - XCHARSET_BYTE_OFFSET (charset))
+              * XCHARSET_CHARS (charset)
+              + (code_point & 0xFF) - XCHARSET_BYTE_OFFSET (charset))
+           + XCHARSET_CODE_OFFSET (charset);
+         if ((cid < XCHARSET_MIN_CODE (charset))
+             || (XCHARSET_MAX_CODE (charset) < cid))
+           return -1;
+         return cid;
        }
-      return
-       decode_builtin_char (mother, code + XCHARSET_CODE_OFFSET(charset));
-    }
-  if (XCHARSET_MAX_CODE (charset))
-    {
-      Emchar cid
-       = (XCHARSET_DIMENSION (charset) == 1
-          ?
-          code_point - XCHARSET_BYTE_OFFSET (charset)
-          :
-          ((code_point >> 8) - XCHARSET_BYTE_OFFSET (charset))
-          * XCHARSET_CHARS (charset)
-          + (code_point & 0xFF) - XCHARSET_BYTE_OFFSET (charset))
-       + XCHARSET_CODE_OFFSET (charset);
-      if ((cid < XCHARSET_MIN_CODE (charset))
-         || (XCHARSET_MAX_CODE (charset) < cid))
-       return -1;
-      return cid;
     }
   else if ((final = XCHARSET_FINAL (charset)) >= '0')
     {
@@ -1111,16 +1111,23 @@ charset_code_point (Lisp_Object charset, Emchar ch, int defined_only)
       Lisp_Object mother = XCHARSET_MOTHER (charset);
       int min = XCHARSET_MIN_CODE (charset);
       int max = XCHARSET_MAX_CODE (charset);
-      int code;
+      int code = -1;
 
       if ( CHARSETP (mother) )
-       code = charset_code_point (mother, ch, defined_only);
+       {
+         if (XCHARSET_FINAL (charset) >= '0')
+           code = charset_code_point (mother, ch, 1);
+         else
+           code = charset_code_point (mother, ch, defined_only);
+       }
       else if (defined_only)
        return -1;
-      else
+      else if ( ((max == 0) && CHARSETP (mother)
+                && (XCHARSET_FINAL (charset) == 0))
+               || ((min <= ch) && (ch <= max)) )
        code = ch;
-      if ( ((max == 0) && CHARSETP (mother)) ||
-          ((min <= code) && (code <= max)) )
+      if ( ((max == 0) && CHARSETP (mother) && (code >= 0))
+          || ((min <= code) && (code <= max)) )
        {
          int d = code - XCHARSET_CODE_OFFSET (charset);
 
@@ -2718,6 +2725,7 @@ syms_of_mule_charset (void)
   defsymbol (&Qucs_bmp,                        "ucs-bmp");
   defsymbol (&Qucs_smp,                        "ucs-smp");
   defsymbol (&Qucs_sip,                        "ucs-sip");
+  defsymbol (&Qucs_gb,                 "ucs-gb");
   defsymbol (&Qucs_cns,                        "ucs-cns");
   defsymbol (&Qucs_jis,                        "ucs-jis");
   defsymbol (&Qucs_ks,                 "ucs-ks");
@@ -2757,8 +2765,6 @@ syms_of_mule_charset (void)
   defsymbol (&Qideograph_hanziku_10,   "ideograph-hanziku-10");
   defsymbol (&Qideograph_hanziku_11,   "ideograph-hanziku-11");
   defsymbol (&Qideograph_hanziku_12,   "ideograph-hanziku-12");
-  defsymbol (&Qchina3_jef,             "china3-jef");
-  defsymbol (&Qideograph_cbeta,                "ideograph-cbeta");
   defsymbol (&Qethiopic_ucs,           "ethiopic-ucs");
 #endif
   defsymbol (&Qchinese_big5_1,         "chinese-big5-1");
@@ -2869,6 +2875,15 @@ complex_vars_of_mule_charset (void)
                  build_string ("\\(ISO10646.*-2\\|UCS00-2\\)"),
                  Qnil, MIN_CHAR_SIP, MAX_CHAR_SIP,
                  MIN_CHAR_SIP, 0, Qnil, CONVERSION_IDENTICAL);
+  staticpro (&Vcharset_ucs_gb);
+  Vcharset_ucs_gb =
+    make_charset (LEADING_BYTE_UCS_GB, Qucs_gb, 256, 3,
+                 2, 2, 0, CHARSET_LEFT_TO_RIGHT,
+                 build_string ("UCS for GB"),
+                 build_string ("UCS for GB"),
+                 build_string ("ISO/IEC 10646 for GB"),
+                 build_string (""),
+                 Qnil, 0, 0, 0, 0, Vcharset_ucs, CONVERSION_IDENTICAL);
   staticpro (&Vcharset_ucs_cns);
   Vcharset_ucs_cns =
     make_charset (LEADING_BYTE_UCS_CNS, Qucs_cns, 256, 3,
@@ -3249,26 +3264,6 @@ complex_vars_of_mule_charset (void)
   DEF_HANZIKU (10);
   DEF_HANZIKU (11);
   DEF_HANZIKU (12);
-  staticpro (&Vcharset_china3_jef);
-  Vcharset_china3_jef =
-    make_charset (LEADING_BYTE_CHINA3_JEF, Qchina3_jef, 256, 2,
-                 2, 2, 0, CHARSET_LEFT_TO_RIGHT,
-                 build_string ("JC3"),
-                 build_string ("JEF + CHINA3"),
-                 build_string ("JEF + CHINA3 private characters"),
-                 build_string ("china3jef-0"),
-                 Qnil, MIN_CHAR_CHINA3_JEF, MAX_CHAR_CHINA3_JEF,
-                 MIN_CHAR_CHINA3_JEF, 0, Qnil, CONVERSION_IDENTICAL);
-  staticpro (&Vcharset_ideograph_cbeta);
-  Vcharset_ideograph_cbeta =
-    make_charset (LEADING_BYTE_CBETA, Qideograph_cbeta, 256, 2,
-                 2, 2, 0, CHARSET_LEFT_TO_RIGHT,
-                 build_string ("CB"),
-                 build_string ("CBETA"),
-                 build_string ("CBETA private characters"),
-                 build_string ("cbeta-0"),
-                 Qnil, MIN_CHAR_CBETA, MAX_CHAR_CBETA,
-                 MIN_CHAR_CBETA, 0, Qnil, CONVERSION_IDENTICAL);
   staticpro (&Vcharset_ideograph_gt);
   Vcharset_ideograph_gt =
     make_charset (LEADING_BYTE_GT, Qideograph_gt, 256, 3,