Merge r21-4-12-chise-0_21-pre9-for-libchise-b1.
[chise/xemacs-chise.git.1] / src / mule-charset.c
index e5e6260..79ddc26 100644 (file)
@@ -22,10 +22,10 @@ Boston, MA 02111-1307, USA.  */
 
 /* Rewritten by Ben Wing <ben@xemacs.org>. */
 
-/* Rewritten by MORIOKA Tomohiko <tomo@m17n.org> for XEmacs UTF-2000. */
+/* Rewritten by MORIOKA Tomohiko <tomo@m17n.org> for XEmacs CHISE. */
 
 #include <config.h>
-#ifdef CHISE
+#ifdef HAVE_LIBCHISE
 #include <chise.h>
 #endif
 #ifdef UTF2000
@@ -299,12 +299,12 @@ Lisp_Object Qascii,
   Qlatin_iso8859_9,
   Qmap_jis_x0208_1978,
   Qmap_gb2312,
-  Qchinese_gb12345,
+  Qmap_gb12345,
   Qmap_jis_x0208_1983,
   Qmap_ks_x1001,
   Qmap_jis_x0212,
-  Qchinese_cns11643_1,
-  Qchinese_cns11643_2,
+  Qmap_cns11643_1,
+  Qmap_cns11643_2,
 #ifdef UTF2000
   Qmap_ucs, Qucs,
   Qucs_bmp,
@@ -862,12 +862,12 @@ decode_defined_char (Lisp_Object ccs, int code_point)
     }
   if (CHARP (decoding_table))
     return XCHAR (decoding_table);
-#ifdef HAVE_CHISE_CLIENT
+#ifdef HAVE_CHISE
   if (EQ (decoding_table, Qunloaded))
     {
       char_id = load_char_decoding_entry_maybe (ccs, code_point);
     }
-#endif
+#endif /* HAVE_CHISE */
   if (char_id >= 0)
     return char_id;
   else if ( CHARSETP (mother = XCHARSET_MOTHER (ccs)) )
@@ -1159,6 +1159,8 @@ charset_code_point (Lisp_Object charset, Emchar ch, int defined_only)
              exit (-1);
            }
        }
+      else if (defined_only)
+       return -1;
       else if ( ( XCHARSET_FINAL (charset) >= '0' ) &&
                ( XCHARSET_MIN_CODE (charset) == 0 )
               /*
@@ -2068,7 +2070,7 @@ Set mapping-table of CHARSET to TABLE.
   return table;
 }
 
-#ifdef HAVE_CHISE_CLIENT
+#ifdef HAVE_CHISE
 DEFUN ("save-charset-mapping-table", Fsave_charset_mapping_table, 1, 1, 0, /*
 Save mapping-table of CHARSET.
 */
@@ -2076,15 +2078,34 @@ Save mapping-table of CHARSET.
 {
   struct Lisp_Charset *cs;
   int byte_min, byte_max;
+#ifdef HAVE_LIBCHISE
+  CHISE_CCS dt_ccs;
+#else /* HAVE_LIBCHISE */
   Lisp_Object db;
   Lisp_Object db_file;
+#endif /* not HAVE_LIBCHISE */
 
   charset = Fget_charset (charset);
   cs = XCHARSET (charset);
 
+#ifdef HAVE_LIBCHISE
+  if ( open_chise_data_source_maybe () )
+    return -1;
+
+  dt_ccs
+    = chise_ds_get_ccs (default_chise_data_source,
+                       XSTRING_DATA (Fsymbol_name (XCHARSET_NAME(charset))));
+  if (dt_ccs == NULL)
+    {
+      printf ("Can't open decoding-table %s\n",
+             XSTRING_DATA (Fsymbol_name (XCHARSET_NAME(charset))));
+      return -1;
+    }
+#else /* HAVE_LIBCHISE */
   db_file = char_attribute_system_db_file (CHARSET_NAME (cs),
                                           Qsystem_char_id, 1);
   db = Fopen_database (db_file, Qnil, Qnil, build_string ("w+"), Qnil);
+#endif /* not HAVE_LIBCHISE */
 
   byte_min = CHARSET_BYTE_OFFSET (cs);
   byte_max = byte_min + CHARSET_BYTE_SIZE (cs);
@@ -2100,9 +2121,15 @@ Save mapping-table of CHARSET.
            Lisp_Object c = get_ccs_octet_table (table_c, charset, cell);
 
            if (CHARP (c))
-             Fput_database (Fprin1_to_string (make_int (cell), Qnil),
-                            Fprin1_to_string (c, Qnil),
-                            db, Qt);
+             {
+#ifdef HAVE_LIBCHISE
+               chise_ccs_set_decoded_char (dt_ccs, cell, XCHAR (c));
+#else /* HAVE_LIBCHISE */
+               Fput_database (Fprin1_to_string (make_int (cell), Qnil),
+                              Fprin1_to_string (c, Qnil),
+                              db, Qt);
+#endif /* not HAVE_LIBCHISE */
+             }
          }
       }
       break;
@@ -2121,11 +2148,19 @@ Save mapping-table of CHARSET.
                Lisp_Object c = get_ccs_octet_table (table_c, charset, cell);
 
                if (CHARP (c))
-                 Fput_database (Fprin1_to_string (make_int ((row << 8)
-                                                            | cell),
-                                                  Qnil),
-                                Fprin1_to_string (c, Qnil),
-                                db, Qt);
+                 {
+#ifdef HAVE_LIBCHISE
+                   chise_ccs_set_decoded_char
+                     (dt_ccs,
+                      (row << 8) | cell, XCHAR (c));
+#else /* HAVE_LIBCHISE */
+                   Fput_database (Fprin1_to_string (make_int ((row << 8)
+                                                              | cell),
+                                                    Qnil),
+                                  Fprin1_to_string (c, Qnil),
+                                  db, Qt);
+#endif /* not HAVE_LIBCHISE */
+                 }
              }
          }
       }
@@ -2153,12 +2188,23 @@ Save mapping-table of CHARSET.
                                                         cell);
 
                    if (CHARP (c))
-                     Fput_database (Fprin1_to_string (make_int ((plane << 16)
-                                                                | (row <<  8)
-                                                                | cell),
-                                                      Qnil),
-                                    Fprin1_to_string (c, Qnil),
-                                    db, Qt);
+                     {
+#ifdef HAVE_LIBCHISE
+                       chise_ccs_set_decoded_char
+                         (dt_ccs,
+                          (plane << 16)
+                          | (row <<  8)
+                          | cell, XCHAR (c));
+#else /* HAVE_LIBCHISE */
+                       Fput_database (Fprin1_to_string
+                                      (make_int ((plane << 16)
+                                                 | (row <<  8)
+                                                 | cell),
+                                       Qnil),
+                                      Fprin1_to_string (c, Qnil),
+                                      db, Qt);
+#endif /* not HAVE_LIBCHISE */
+                     }
                  }
              }
          }
@@ -2193,21 +2239,37 @@ Save mapping-table of CHARSET.
                          = get_ccs_octet_table (table_c, charset, cell);
 
                        if (CHARP (c))
-                         Fput_database (Fprin1_to_string
-                                        (make_int ((  group << 24)
-                                                   | (plane << 16)
-                                                   | (row   <<  8)
-                                                   |  cell),
-                                         Qnil),
-                                        Fprin1_to_string (c, Qnil),
-                                        db, Qt);
+                         {
+#ifdef HAVE_LIBCHISE
+                           chise_ccs_set_decoded_char
+                             (dt_ccs,
+                              (  group << 24)
+                              | (plane << 16)
+                              | (row   <<  8)
+                              |  cell, XCHAR (c));
+#else /* HAVE_LIBCHISE */
+                           Fput_database (Fprin1_to_string
+                                          (make_int ((  group << 24)
+                                                     | (plane << 16)
+                                                     | (row   <<  8)
+                                                     |  cell),
+                                           Qnil),
+                                          Fprin1_to_string (c, Qnil),
+                                          db, Qt);
+#endif /* not HAVE_LIBCHISE */
+                         }
                      }
                  }
              }
          }
       }
     }
+#ifdef HAVE_LIBCHISE
+  chise_ccs_sync (dt_ccs);
+  return Qnil;
+#else /* HAVE_LIBCHISE */
   return Fclose_database (db);
+#endif /* not HAVE_LIBCHISE */
 }
 
 DEFUN ("reset-charset-mapping-table", Freset_charset_mapping_table, 1, 1, 0, /*
@@ -2215,13 +2277,35 @@ Reset mapping-table of CCS with database file.
 */
        (ccs))
 {
+#ifdef HAVE_LIBCHISE
+  CHISE_CCS chise_ccs;
+#else
   Lisp_Object db_file;
+#endif
 
   ccs = Fget_charset (ccs);
+
+#ifdef HAVE_LIBCHISE
+  if ( open_chise_data_source_maybe () )
+    return -1;
+
+  chise_ccs = chise_ds_get_ccs (default_chise_data_source,
+                               XSTRING_DATA (Fsymbol_name
+                                             (XCHARSET_NAME(ccs))));
+  if (chise_ccs == NULL)
+    return Qnil;
+#else
   db_file = char_attribute_system_db_file (XCHARSET_NAME(ccs),
                                           Qsystem_char_id, 0);
+#endif
 
-  if (!NILP (Ffile_exists_p (db_file)))
+  if (
+#ifdef HAVE_LIBCHISE
+      chise_ccs_setup_db (chise_ccs, 0) == 0
+#else
+      !NILP (Ffile_exists_p (db_file))
+#endif
+      )
     {
       XCHARSET_DECODING_TABLE(ccs) = Qunloaded;
       return Qt;
@@ -2232,64 +2316,24 @@ Reset mapping-table of CCS with database file.
 Emchar
 load_char_decoding_entry_maybe (Lisp_Object ccs, int code_point)
 {
-#ifdef CHISE
-  Lisp_Object db_dir = Vexec_directory;
-  CHISE_DS ds;
-  CHISE_Decoding_Table *dt_ccs;
-  int modemask;
-  int accessmask = 0;
-  DBTYPE real_subtype;
-  int status;
+#ifdef HAVE_LIBCHISE
   CHISE_Char_ID char_id;
 
-  if (NILP (db_dir))
-    db_dir = build_string ("../lib-src");
-  db_dir = Fexpand_file_name (build_string ("char-db"), db_dir);
-
-  status = chise_open_data_source (&ds, CHISE_DS_Berkeley_DB,
-                                  XSTRING_DATA (db_dir));
-  if (status)
-    {
-      chise_close_data_source (&ds);
-      return -1;
-    }
-
-  modemask = 0755;             /* rwxr-xr-x */
-  real_subtype = DB_HASH;
-  accessmask = DB_RDONLY;
-
-  status
-    = chise_open_decoding_table (&dt_ccs, &ds,
-                                XSTRING_DATA (Fsymbol_name
-                                              (XCHARSET_NAME(ccs))),
-                                real_subtype,
-                                accessmask, modemask);
-  if (status)
-    {
-      printf ("Can't open decoding-table %s\n",
-             XSTRING_DATA (Fsymbol_name (XCHARSET_NAME(ccs))));
-      chise_close_decoding_table (dt_ccs);
-      chise_close_data_source (&ds);
-      return -1;
-    }
+  if ( open_chise_data_source_maybe () )
+    return -1;
 
-  char_id = chise_dt_get_char (dt_ccs, code_point);
-  /*
-  printf ("%s's 0x%X (%d) => 0x%X\n",
-         XSTRING_DATA (Fsymbol_name (XCHARSET_NAME(ccs))),
-         code_point, code_point, char_id);
-  */
+  char_id
+    = chise_ds_decode_char (default_chise_data_source,
+                           XSTRING_DATA(Fsymbol_name (XCHARSET_NAME(ccs))),
+                           code_point);
   if (char_id >= 0)
     decoding_table_put_char (ccs, code_point, make_char (char_id));
   else
     decoding_table_put_char (ccs, code_point, Qnil);
 
-  chise_close_decoding_table (dt_ccs);
-
-  chise_close_data_source (&ds);
-
+  /* chise_ccst_close (dt_ccs); */
   return char_id;
-#else
+#else /* HAVE_LIBCHISE */
   Lisp_Object db;
   Lisp_Object db_file
     = char_attribute_system_db_file (XCHARSET_NAME(ccs), Qsystem_char_id,
@@ -2315,9 +2359,9 @@ load_char_decoding_entry_maybe (Lisp_Object ccs, int code_point)
       Fclose_database (db);
     }
   return -1;
-#endif
+#endif /* not HAVE_LIBCHISE */
 }
-#endif /* HAVE_CHISE_CLIENT */
+#endif /* HAVE_CHISE */
 #endif /* UTF2000 */
 
 \f
@@ -2649,18 +2693,19 @@ syms_of_mule_charset (void)
   DEFSUBR (Fcharset_id);
   DEFSUBR (Fset_charset_ccl_program);
   DEFSUBR (Fset_charset_registry);
+
 #ifdef UTF2000
   DEFSUBR (Fcharset_mapping_table);
   DEFSUBR (Fset_charset_mapping_table);
-#ifdef HAVE_CHISE_CLIENT
+#ifdef HAVE_CHISE
   DEFSUBR (Fsave_charset_mapping_table);
   DEFSUBR (Freset_charset_mapping_table);
-#endif
-
+#endif /* HAVE_CHISE */
   DEFSUBR (Fdecode_char);
   DEFSUBR (Fdecode_builtin_char);
   DEFSUBR (Fencode_char);
 #endif
+
   DEFSUBR (Fmake_char);
   DEFSUBR (Fchar_charset);
   DEFSUBR (Fchar_octet);
@@ -2713,12 +2758,12 @@ syms_of_mule_charset (void)
   defsymbol (&Qlatin_iso8859_9,                "latin-iso8859-9");
   defsymbol (&Qmap_jis_x0208_1978,     "=jis-x0208-1978");
   defsymbol (&Qmap_gb2312,             "=gb2312");
-  defsymbol (&Qchinese_gb12345,                "chinese-gb12345");
+  defsymbol (&Qmap_gb12345,            "=gb12345");
   defsymbol (&Qmap_jis_x0208_1983,     "=jis-x0208-1983");
   defsymbol (&Qmap_ks_x1001,           "=ks-x1001");
   defsymbol (&Qmap_jis_x0212,          "=jis-x0212");
-  defsymbol (&Qchinese_cns11643_1,     "chinese-cns11643-1");
-  defsymbol (&Qchinese_cns11643_2,     "chinese-cns11643-2");
+  defsymbol (&Qmap_cns11643_1,         "=cns11643-1");
+  defsymbol (&Qmap_cns11643_2,         "=cns11643-2");
 #ifdef UTF2000
   defsymbol (&Qmap_ucs,                        "=ucs");
   defsymbol (&Qucs,                    "ucs");
@@ -3024,7 +3069,7 @@ complex_vars_of_mule_charset (void)
                  Qnil, 0, 0, 0, 33, Qnil, CONVERSION_IDENTICAL);
   staticpro (&Vcharset_chinese_gb12345);
   Vcharset_chinese_gb12345 =
-    make_charset (LEADING_BYTE_CHINESE_GB12345, Qchinese_gb12345, 94, 2,
+    make_charset (LEADING_BYTE_CHINESE_GB12345, Qmap_gb12345, 94, 2,
                  2, 0, 0, CHARSET_LEFT_TO_RIGHT,
                  build_string ("G1"),
                  build_string ("GB 12345)"),
@@ -3085,7 +3130,7 @@ complex_vars_of_mule_charset (void)
 #define CHINESE_CNS_PLANE_RE(n) "cns11643[.-]\\(.*[.-]\\)?" n "$"
   staticpro (&Vcharset_chinese_cns11643_1);
   Vcharset_chinese_cns11643_1 =
-    make_charset (LEADING_BYTE_CHINESE_CNS11643_1, Qchinese_cns11643_1, 94, 2,
+    make_charset (LEADING_BYTE_CHINESE_CNS11643_1, Qmap_cns11643_1, 94, 2,
                  2, 0, 'G', CHARSET_LEFT_TO_RIGHT,
                  build_string ("CNS11643-1"),
                  build_string ("CNS11643-1 (Chinese traditional)"),
@@ -3095,7 +3140,7 @@ complex_vars_of_mule_charset (void)
                  Qnil, 0, 0, 0, 33, Qnil, CONVERSION_IDENTICAL);
   staticpro (&Vcharset_chinese_cns11643_2);
   Vcharset_chinese_cns11643_2 =
-    make_charset (LEADING_BYTE_CHINESE_CNS11643_2, Qchinese_cns11643_2, 94, 2,
+    make_charset (LEADING_BYTE_CHINESE_CNS11643_2, Qmap_cns11643_2, 94, 2,
                  2, 0, 'H', CHARSET_LEFT_TO_RIGHT,
                  build_string ("CNS11643-2"),
                  build_string ("CNS11643-2 (Chinese traditional)"),