List:Commits« Previous MessageNext Message »
From:bar Date:December 31 2005 5:01am
Subject:bk commit into 5.1 tree (bar:1.2012)
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of bar. When bar does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet
  1.2012 05/12/31 09:01:26 bar@stripped +42 -0
  WL#1324 table name to file name encoding
  - Encoding itself, implemented as a charset
    "filename". Originally planned to use '.'
    as an escape character, but now changed to '@'
    for two reasons: "ls" does not return
    file names starting with '.' considering them
    as a kind of hidden files; some platforms
    do not allow several dots in a file name.
  - replacing many calls of my_snprintf() and
    strnxmov() to the new build_table_filename().
  - Adding MY_APPEND_EXT mysys flag, to append
    an extention rather that replace it.
  - Replacing all numeric constants in fn_format
    flag arguments to their mysys definitions, e.g.
    MY_UNPACK_FILENAME,
  - Predictability in several function/methods:
    when a table name can appear with or withot .frm
    extension. Some functions/methods were changed
    so accept names strictly with .frm, other - strictly
    without .frm extensions. Several DBUG_ASSERTs were
    added to check whether an extension is passed.
  Many files:
    table name to file name encoding
  mysql_priv.h:
    Prototypes for new table name encoding tools.
  ctype-utf8.c:
    Implementing "filename" charset for
    table name to file name encoding.
  row0mysql.c:
    Fixing table name prefix.
  mf_format.c:
    Adding MY_APPEND_EXT processing.
  Many files:
    Fixing tests.
  my_sys.h:
    Adding new flag to append rather than replace an extension.
  m_ctype.h:
    Adding "filename" charset definition.

  storage/myisammrg/myrg_open.c
    1.32 05/12/31 08:58:47 bar@stripped +2 -1
    table name to file name encoding

  storage/myisammrg/myrg_create.c
    1.13 05/12/31 08:58:19 bar@stripped +2 -1
    table name to file name encoding

  sql/mysql_priv.h
    1.361 05/12/31 08:57:36 bar@stripped +18 -0
    Prototypes for new table name encoding tools.

  strings/ctype-utf8.c
    1.98 05/12/31 08:56:53 bar@stripped +1287 -0
    Implementing "filename" charset for
    table name to file name encoding.

  storage/myisam/mi_rename.c
    1.10 05/12/31 08:55:57 bar@stripped +4 -4
    table name to file name encoding

  storage/myisam/mi_open.c
    1.99 05/12/31 08:55:55 bar@stripped +5 -2
    table name to file name encoding

  storage/myisam/mi_delete_table.c
    1.11 05/12/31 08:55:53 bar@stripped +2 -2
    table name to file name encoding

  storage/myisam/mi_create.c
    1.56 05/12/31 08:55:49 bar@stripped +27 -10
    table name to file name encoding

  storage/innobase/row/row0mysql.c
    1.118 05/12/31 08:55:25 bar@stripped +2 -1
    Fixing table name prefix.
    ,

  sql/unireg.cc
    1.72 05/12/31 08:54:50 bar@stripped +10 -8
    table name to file name encoding

  sql/table.cc
    1.197 05/12/31 08:54:48 bar@stripped +40 -10
    table name to file name encoding

  sql/strfunc.cc
    1.10 05/12/31 08:54:46 bar@stripped +76 -0
    table name to file name encoding

  sql/sql_view.cc
    1.83 05/12/31 08:54:44 bar@stripped +13 -12
    table name to file name encoding

  sql/sql_trigger.cc
    1.41 05/12/31 08:54:42 bar@stripped +25 -36
    table name to file name encoding

  sql/sql_table.cc
    1.289 05/12/31 08:54:40 bar@stripped +96 -65
    table name to file name encoding

  sql/sql_show.cc
    1.293 05/12/31 08:54:38 bar@stripped +26 -13
    table name to file name encoding

  sql/sql_rename.cc
    1.34 05/12/31 08:54:36 bar@stripped +4 -7
    table name to file name encoding

  sql/sql_delete.cc
    1.166 05/12/31 08:54:34 bar@stripped +5 -4
    table name to file name encoding

  sql/sql_db.cc
    1.123 05/12/31 08:54:32 bar@stripped +14 -11
    table name to file name encoding

  sql/sql_base.cc
    1.292 05/12/31 08:54:30 bar@stripped +2 -3
    table name to file name encoding

  sql/sql_acl.cc
    1.169 05/12/31 08:54:28 bar@stripped +4 -3
    table name to file name encoding

  sql/parse_file.cc
    1.19 05/12/31 08:54:25 bar@stripped +14 -2
    table name to file name encoding

  sql/mysqld.cc
    1.510 05/12/31 08:54:03 bar@stripped +2 -2
    table name to file name encoding

  sql/init.cc
    1.17 05/12/31 08:53:59 bar@stripped +1 -0
    table name to file name encoding

  sql/handler.cc
    1.201 05/12/31 08:53:56 bar@stripped +1 -1
    table name to file name encoding.

  sql/ha_partition.cc
    1.18 05/12/31 08:53:54 bar@stripped +4 -3
    table name to file name encoding

  sql/ha_ndbcluster.cc
    1.228 05/12/31 08:53:52 bar@stripped +2 -1
    table name to file name encoding

  sql/ha_myisammrg.cc
    1.76 05/12/31 08:53:50 bar@stripped +8 -5
    table name to file name encoding

  sql/ha_myisam.cc
    1.166 05/12/31 08:53:48 bar@stripped +5 -5
    table name to file name encoding

  sql/ha_innodb.cc
    1.247 05/12/31 08:53:45 bar@stripped +1 -1
    table name to file name encoding

  sql/ha_berkeley.cc
    1.166 05/12/31 08:53:40 bar@stripped +16 -9
    table name to file name encoding

  sql/discover.cc
    1.4 05/12/31 08:53:07 bar@stripped +4 -2
    table name to file name encoding

  mysys/mf_format.c
    1.22 05/12/31 08:52:11 bar@stripped +2 -1
    Adding MY_APPEND_EXT processing.

  mysql-test/r/show_check.result
    1.87 05/12/31 08:51:24 bar@stripped +36 -2

  mysql-test/r/mysqldump.result
    1.88 05/12/31 08:51:20 bar@stripped +1 -1
    Fixing tests.

  mysql-test/r/create.result
    1.111 05/12/31 08:51:16 bar@stripped +8 -3
    Fixing tests.

  mysql-test/r/alter_table.result
    1.58 05/12/31 08:51:12 bar@stripped +4 -4
    Fixing tests.

  mysql-test/t/show_check.test
    1.60 05/12/31 08:49:53 bar@stripped +22 -30
    Fixing tests.

  mysql-test/t/create.test
    1.73 05/12/31 08:49:49 bar@stripped +4 -3
    Fixing tests.

  mysql-test/t/alter_table.test
    1.45 05/12/31 08:49:41 bar@stripped +2 -2
    Fixing tests.

  include/my_sys.h
    1.183 05/12/31 08:48:11 bar@stripped +2 -0
    Adding new flag to append rather than replace an extension.

  include/m_ctype.h
    1.116 05/12/31 08:47:39 bar@stripped +1 -0
    Adding "filename" charset definition.

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	bar
# Host:	bar.intranet.mysql.r18.ru
# Root:	/usr/home/bar/mysql-5.1-new.fscs3

--- 1.115/include/m_ctype.h	2005-11-05 15:20:31 +04:00
+++ 1.116/include/m_ctype.h	2005-12-31 08:47:39 +04:00
@@ -269,6 +269,7 @@
 extern CHARSET_INFO my_charset_utf8_general_ci;
 extern CHARSET_INFO my_charset_utf8_bin;
 extern CHARSET_INFO my_charset_cp1250_czech_ci;
+extern CHARSET_INFO my_charset_filename;
 
 /* declarations for simple charsets */
 extern int  my_strnxfrm_simple(CHARSET_INFO *, uchar *, uint, const uchar *,

--- 1.182/include/my_sys.h	2005-12-20 02:23:28 +04:00
+++ 1.183/include/my_sys.h	2005-12-31 08:48:11 +04:00
@@ -98,6 +98,8 @@
 #define MY_RETURN_REAL_PATH	32	/* return full path for file */
 #define MY_SAFE_PATH		64	/* Return NULL if too long path */
 #define MY_RELATIVE_PATH	128	/* name is relative to 'dir' */
+#define MY_APPEND_EXT           256     /* add 'ext' as additional extension*/
+
 
 	/* My seek flags */
 #define MY_SEEK_SET	0

--- 1.55/storage/myisam/mi_create.c	2005-12-28 16:05:20 +04:00
+++ 1.56/storage/myisam/mi_create.c	2005-12-31 08:55:49 +04:00
@@ -547,8 +547,13 @@
 
   if (ci->index_file_name)
   {
-    fn_format(filename, ci->index_file_name,"",MI_NAME_IEXT,4);
-    fn_format(linkname,name, "",MI_NAME_IEXT,4);
+    char *iext= strrchr(ci->index_file_name, '.');
+    int have_iext= iext && !strcmp(iext, MI_NAME_IEXT);
+    
+    fn_format(filename, ci->index_file_name, "", MI_NAME_IEXT,
+              MY_UNPACK_FILENAME| (have_iext ? MY_REPLACE_EXT :MY_APPEND_EXT));
+    fn_format(linkname, name, "", MI_NAME_IEXT,
+              MY_UNPACK_FILENAME|MY_APPEND_EXT);
     linkname_ptr=linkname;
     /*
       Don't create the table if the link or file exists to ensure that one
@@ -558,8 +563,10 @@
   }
   else
   {
-    fn_format(filename,name,"",MI_NAME_IEXT,(4+ (flags & HA_DONT_TOUCH_DATA) ?
-					     32 : 0));
+    fn_format(filename, name, "", MI_NAME_IEXT,
+              (MY_UNPACK_FILENAME |
+               (flags & HA_DONT_TOUCH_DATA) ? MY_RETURN_REAL_PATH : 0) |
+                MY_APPEND_EXT);
     linkname_ptr=0;
     /* Replace the current file */
     create_flag=MY_DELETE_OLD;
@@ -590,7 +597,8 @@
 #ifdef USE_RAID
     if (share.base.raid_type)
     {
-      (void) fn_format(filename,name,"",MI_NAME_DEXT,2+4);
+      (void) fn_format(filename, name, "", MI_NAME_DEXT,
+                       MY_UNPACK_FILENAME | MY_APPEND_EXT);
       if ((dfile=my_raid_create(filename, 0, create_mode,
 				share.base.raid_type,
 				share.base.raid_chunks,
@@ -603,14 +611,21 @@
     {
       if (ci->data_file_name)
       {
-	fn_format(filename, ci->data_file_name,"",MI_NAME_DEXT,4);
-	fn_format(linkname, name, "",MI_NAME_DEXT,4);
+        char *dext= strrchr(ci->data_file_name, '.');
+        int have_dext= dext && !strcmp(dext, MI_NAME_DEXT);
+
+	fn_format(filename, ci->data_file_name, "", MI_NAME_DEXT,
+	          MY_UNPACK_FILENAME |
+	          (have_dext ? MY_REPLACE_EXT : MY_APPEND_EXT));
+	fn_format(linkname, name, "",MI_NAME_DEXT,
+	          MY_UNPACK_FILENAME | MY_APPEND_EXT);
 	linkname_ptr=linkname;
 	create_flag=0;
       }
       else
       {
-	fn_format(filename,name,"",MI_NAME_DEXT,4);
+	fn_format(filename,name,"", MI_NAME_DEXT,
+	          MY_UNPACK_FILENAME | MY_APPEND_EXT);
 	linkname_ptr=0;
 	create_flag=MY_DELETE_OLD;
       }
@@ -759,13 +774,15 @@
   case 2:
   if (! (flags & HA_DONT_TOUCH_DATA))
-    my_delete_with_symlink(fn_format(filename,name,"",MI_NAME_DEXT,2+4),
+    my_delete_with_symlink(fn_format(filename,name,"",MI_NAME_DEXT,
+                                     MY_UNPACK_FILENAME | MY_APPEND_EXT),
 			   MYF(0));
     /* fall through */
   case 1:
     VOID(my_close(file,MYF(0)));
     if (! (flags & HA_DONT_TOUCH_DATA))
-      my_delete_with_symlink(fn_format(filename,name,"",MI_NAME_IEXT,2+4),
+      my_delete_with_symlink(fn_format(filename,name,"",MI_NAME_IEXT,
+                                       MY_UNPACK_FILENAME | MY_APPEND_EXT),
 			     MYF(0));
   }
   my_free((char*) rec_per_key_part, MYF(0));

--- 1.10/storage/myisam/mi_delete_table.c	2005-04-08 03:54:34 +05:00
+++ 1.11/storage/myisam/mi_delete_table.c	2005-12-31 08:55:53 +04:00
@@ -46,10 +46,10 @@
 #endif
 #endif /* USE_RAID */
 
-  fn_format(from,name,"",MI_NAME_IEXT,4);
+  fn_format(from,name,"",MI_NAME_IEXT,MY_UNPACK_FILENAME|MY_APPEND_EXT);
   if (my_delete_with_symlink(from, MYF(MY_WME)))
     DBUG_RETURN(my_errno);
-  fn_format(from,name,"",MI_NAME_DEXT,4);
+  fn_format(from,name,"",MI_NAME_DEXT,MY_UNPACK_FILENAME|MY_APPEND_EXT);
 #ifdef USE_RAID
   if (raid_type)
     DBUG_RETURN(my_raid_delete(from, raid_chunks, MYF(MY_WME)) ? my_errno : 0);

--- 1.98/storage/myisam/mi_open.c	2005-12-28 16:05:20 +04:00
+++ 1.99/storage/myisam/mi_open.c	2005-12-31 08:55:55 +04:00
@@ -95,7 +95,8 @@
   head_length=sizeof(share_buff.state.header);
   bzero((byte*) &info,sizeof(info));
 
-  my_realpath(name_buff, fn_format(org_name,name,"",MI_NAME_IEXT,4),MYF(0));
+  my_realpath(name_buff, fn_format(org_name,name,"",MI_NAME_IEXT,
+                                   MY_UNPACK_FILENAME|MY_APPEND_EXT),MYF(0));
   pthread_mutex_lock(&THR_LOCK_myisam);
   if (!(old_info=test_if_reopen(name_buff)))
   {
@@ -159,7 +160,9 @@
     if (!strcmp(name_buff, org_name) ||
         my_readlink(index_name, org_name, MYF(0)) == -1)
       (void) strmov(index_name, org_name);
-    (void) fn_format(data_name,org_name,"",MI_NAME_DEXT,2+4+16);
+    *strrchr(org_name, '.')= '\0';
+    (void) fn_format(data_name,org_name,"",MI_NAME_DEXT,
+                     MY_APPEND_EXT|MY_UNPACK_FILENAME|MY_RESOLVE_SYMLINKS);
 
     info_length=mi_uint2korr(share->state.header.header_length);
     base_pos=mi_uint2korr(share->state.header.base_pos);

--- 1.9/storage/myisam/mi_rename.c	2005-04-08 03:54:34 +05:00
+++ 1.10/storage/myisam/mi_rename.c	2005-12-31 08:55:57 +04:00
@@ -46,12 +46,12 @@
 #endif
 #endif /* USE_RAID */
 
-  fn_format(from,old_name,"",MI_NAME_IEXT,4);
-  fn_format(to,new_name,"",MI_NAME_IEXT,4);
+  fn_format(from,old_name,"",MI_NAME_IEXT,MY_UNPACK_FILENAME|MY_APPEND_EXT);
+  fn_format(to,new_name,"",MI_NAME_IEXT,MY_UNPACK_FILENAME|MY_APPEND_EXT);
   if (my_rename_with_symlink(from, to, MYF(MY_WME)))
     DBUG_RETURN(my_errno);
-  fn_format(from,old_name,"",MI_NAME_DEXT,4);
-  fn_format(to,new_name,"",MI_NAME_DEXT,4);
+  fn_format(from,old_name,"",MI_NAME_DEXT,MY_UNPACK_FILENAME|MY_APPEND_EXT);
+  fn_format(to,new_name,"",MI_NAME_DEXT,MY_UNPACK_FILENAME|MY_APPEND_EXT);
 #ifdef USE_RAID
   if (raid_type)
     DBUG_RETURN(my_raid_rename(from, to, raid_chunks, MYF(MY_WME)) ? my_errno :

--- 1.12/storage/myisammrg/myrg_create.c	2005-04-27 07:07:09 +05:00
+++ 1.13/storage/myisammrg/myrg_create.c	2005-12-31 08:58:19 +04:00
@@ -33,7 +33,8 @@
   DBUG_ENTER("myrg_create");
 
   errpos=0;
-  if ((file = my_create(fn_format(buff,name,"",MYRG_NAME_EXT,4),0,
+  if ((file = my_create(fn_format(buff,name,"",MYRG_NAME_EXT,
+                                  MY_UNPACK_FILENAME|MY_APPEND_EXT),0,
        O_RDWR | O_EXCL | O_NOFOLLOW,MYF(MY_WME))) < 0)
     goto err;
   errpos=1;

--- 1.31/storage/myisammrg/myrg_open.c	2005-06-02 03:50:21 +05:00
+++ 1.32/storage/myisammrg/myrg_open.c	2005-12-31 08:58:47 +04:00
@@ -46,7 +46,8 @@
   LINT_INIT(key_parts);
 
   bzero((char*) &file,sizeof(file));
-  if ((fd=my_open(fn_format(name_buff,name,"",MYRG_NAME_EXT,4),
+  if ((fd=my_open(fn_format(name_buff,name,"",MYRG_NAME_EXT,
+                            MY_UNPACK_FILENAME|MY_APPEND_EXT),
 		  O_RDONLY | O_SHARE,MYF(0))) < 0)
      goto err;
    errpos=1;

--- 1.21/mysys/mf_format.c	2005-10-06 19:54:24 +05:00
+++ 1.22/mysys/mf_format.c	2005-12-31 08:52:11 +04:00
@@ -54,7 +54,8 @@
   if (flag & MY_UNPACK_FILENAME)
     (void) unpack_dirname(dev,dev);		/* Replace ~/.. with dir */
 
-  if ((pos= (char*) strchr(name,FN_EXTCHAR)) != NullS)
+  if (!(flag & MY_APPEND_EXT) &&
+      (pos= (char*) strchr(name,FN_EXTCHAR)) != NullS)
   {
     if ((flag & MY_REPLACE_EXT) == 0)		/* If we should keep old ext */
     {

--- 1.165/sql/ha_berkeley.cc	2005-12-21 22:24:56 +04:00
+++ 1.166/sql/ha_berkeley.cc	2005-12-31 08:53:40 +04:00
@@ -699,7 +699,7 @@
     if ((error= db_env->txn_begin(db_env, NULL, (DB_TXN**) &transaction, 0)) ||
 	(error= (file->open(file, transaction,
 			    fn_format(name_buff, name, "", ha_berkeley_ext,
-				      2 | 4),
+				      MY_UNPACK_FILENAME|MY_APPEND_EXT),
 			    "main", DB_BTREE, open_mode, 0))) ||
 	(error= transaction->commit(transaction, 0)))
     {
@@ -2093,7 +2093,8 @@
   int error;
   DBUG_ENTER("ha_berkeley::create");
 
-  fn_format(name_buff,name,"", ha_berkeley_ext,2 | 4);
+  fn_format(name_buff,name,"", ha_berkeley_ext,
+            MY_UNPACK_FILENAME|MY_APPEND_EXT);
 
   /* Create the main table that will hold the real rows */
   if ((error= create_sub_table(name_buff,"main",DB_BTREE,0)))
@@ -2142,8 +2143,9 @@
   if ((error=db_create(&file, db_env, 0)))
     my_errno=error; /* purecov: inspected */
   else
-    error=file->remove(file,fn_format(name_buff,name,"",ha_berkeley_ext,2 | 4),
-		       NULL,0);
+    error=file->remove(file,fn_format(name_buff,name,"",ha_berkeley_ext,
+                                      MY_UNPACK_FILENAME|MY_APPEND_EXT),
+                       NULL,0);
   file=0;					// Safety
   DBUG_RETURN(error);
 }
@@ -2161,9 +2163,11 @@
   {
     /* On should not do a file->close() after rename returns */
     error= file->rename(file, 
-			fn_format(from_buff, from, "", ha_berkeley_ext, 2 | 4),
+			fn_format(from_buff, from, "", 
+                                  ha_berkeley_ext,
+                                  MY_UNPACK_FILENAME|MY_APPEND_EXT),
 			NULL, fn_format(to_buff, to, "", ha_berkeley_ext,
-					2 | 4), 0);
+                                        MY_UNPACK_FILENAME|MY_APPEND_EXT), 0);
   }
   return error;
 }
@@ -2413,7 +2417,8 @@
 			   (hidden_primary_key ? berkeley_cmp_hidden_key :
 			    berkeley_cmp_packed_key));
   tmp_file->app_private= (void*) (table->key_info+table->primary_key);
-  fn_format(name_buff,share->table_name.str,"", ha_berkeley_ext, 2 | 4);
+  fn_format(name_buff,share->table_name.str,"", ha_berkeley_ext,
+            MY_UNPACK_FILENAME|MY_APPEND_EXT);      
   if ((error=tmp_file->verify(tmp_file, name_buff, NullS, (FILE*) 0,
 			      hidden_primary_key ? 0 : DB_NOORDERCHK)))
   {
@@ -2559,7 +2564,8 @@
       char name_buff[FN_REFLEN];
       uint open_mode= (((table->db_stat & HA_READ_ONLY) ? DB_RDONLY : 0)
 		       | DB_THREAD);
-      fn_format(name_buff, share->table_name, "", ha_berkeley_ext, 2 | 4);
+      fn_format(name_buff, share->table_name, "", ha_berkeley_ext,
+                MY_UNPACK_FILENAME|MY_APPEND_EXT);
       if (!db_create(&share->status_block, db_env, 0))
       {
 	if (share->status_block->open(share->status_block, NULL, name_buff,
@@ -2641,7 +2647,8 @@
       share->status_block->set_flags(share->status_block,0); /* purecov: inspected */
       if (share->status_block->open(share->status_block, NULL,
 				    fn_format(name_buff,share->table_name,
-                                              "", ha_berkeley_ext,2 | 4),
+                                              "", ha_berkeley_ext,
+                                              MY_UNPACK_FILENAME|MY_APPEND_EXT),
 				    "status", DB_BTREE,
 				    DB_THREAD | DB_CREATE, my_umask)) /* purecov: inspected */
 	goto end; /* purecov: inspected */

--- 1.165/sql/ha_myisam.cc	2005-12-28 16:05:20 +04:00
+++ 1.166/sql/ha_myisam.cc	2005-12-31 08:53:48 +04:00
@@ -539,8 +539,8 @@
   }
 
   /* Change extension */
-  if (!fn_format(dst_path, dst_path, "", MI_NAME_DEXT,
-		 MY_REPLACE_EXT | MY_UNPACK_FILENAME | MY_SAFE_PATH))
+  if (fn_format_relative_to_data_home(dst_path, table_name, backup_dir,
+                                      MI_NAME_DEXT))
   {
     errmsg = "Failed in fn_format() for .MYD file (errno: %d)";
     error = HA_ADMIN_INVALID;
@@ -1361,10 +1361,10 @@
      if table is symlinked (Ie;  Real name is not same as generated name)
    */
     data_file_name= index_file_name= 0;
-    fn_format(name_buff, file->filename, "", MI_NAME_DEXT, 2);
+    fn_format(name_buff, file->filename, "", MI_NAME_DEXT, MY_APPEND_EXT);
     if (strcmp(name_buff, info.data_file_name))
       data_file_name=info.data_file_name;
-    strmov(fn_ext(name_buff),MI_NAME_IEXT);
+    fn_format(name_buff, file->filename, "", MI_NAME_IEXT, MY_APPEND_EXT);
     if (strcmp(name_buff, info.index_file_name))
       index_file_name=info.index_file_name;
   }
@@ -1647,7 +1647,7 @@
     create_flags|= HA_CREATE_DELAY_KEY_WRITE;
 
   /* TODO: Check that the following fn_format is really needed */
-  error=mi_create(fn_format(buff,name,"","",2+4),
+  error=mi_create(fn_format(buff,name,"","",MY_UNPACK_FILENAME|MY_APPEND_EXT),
 		  share->keys,keydef,
 		  (uint) (recinfo_pos-recinfo), recinfo,
 		  0, (MI_UNIQUEDEF*) 0,

--- 1.75/sql/ha_myisammrg.cc	2005-12-21 22:18:27 +04:00
+++ 1.76/sql/ha_myisammrg.cc	2005-12-31 08:53:50 +04:00
@@ -105,8 +105,9 @@
   char name_buff[FN_REFLEN];
 
   DBUG_PRINT("info", ("ha_myisammrg::open"));
-  if (!(file=myrg_open(fn_format(name_buff,name,"","",2 | 4), mode,
-		       test_if_locked)))
+  if (!(file=myrg_open(fn_format(name_buff,name,"","",
+                                 MY_UNPACK_FILENAME|MY_APPEND_EXT),
+                       mode, test_if_locked)))
   {
     DBUG_PRINT("info", ("ha_myisammrg::open exit %d", my_errno));
     return (my_errno ? my_errno : -1);
@@ -469,8 +470,8 @@
         This means that it might not be possible to move the DATADIR of
         an embedded server without changing the paths in the .MRG file.
       */
-      uint length= my_snprintf(buff, FN_REFLEN, "%s/%s/%s", mysql_data_home,
-			       tables->db, tables->table_name);
+      uint length= build_table_filename(buff, sizeof(buff),
+                                        tables->db, tables->table_name, "");
       /*
         If a MyISAM table is in the same directory as the MERGE table,
         we use the table name without a path. This means that the
@@ -488,7 +489,9 @@
     *pos++= table_name;
   }
   *pos=0;
-  DBUG_RETURN(myrg_create(fn_format(buff,name,"","",2+4+16),
+  DBUG_RETURN(myrg_create(fn_format(buff,name,"","",
+                                    MY_RESOLVE_SYMLINKS|
+                                    MY_UNPACK_FILENAME|MY_APPEND_EXT),
 			  table_names,
                           create_info->merge_insert_method,
                           (my_bool) 0));

--- 1.200/sql/handler.cc	2005-12-28 06:55:55 +04:00
+++ 1.201/sql/handler.cc	2005-12-31 08:53:56 +04:00
@@ -2023,7 +2023,7 @@
 
   for (const char **ext=bas_ext(); *ext ; ext++)
   {
-    fn_format(buff, name, "", *ext, 2 | 4);
+    fn_format(buff, name, "", *ext, MY_UNPACK_FILENAME|MY_APPEND_EXT);
     if (my_delete_with_symlink(buff, MYF(0)))
     {
       if ((error= my_errno) != ENOENT)

--- 1.16/sql/init.cc	2005-08-12 15:54:35 +05:00
+++ 1.17/sql/init.cc	2005-12-31 08:53:59 +04:00
@@ -39,6 +39,7 @@
 #endif
 
   VOID(strmov(reg_ext,".frm"));
+  reg_ext_length= 4;
   specialflag=SPECIAL_SAME_DB_NAME | options;  /* Set options from argv */
   /* Make a tab of powers of 10 */
   for (i=0,nr=1.0; i < array_elements(log_10) ; i++)

--- 1.360/sql/mysql_priv.h	2005-12-28 20:47:54 +04:00
+++ 1.361/sql/mysql_priv.h	2005-12-31 08:57:36 +04:00
@@ -1174,6 +1174,7 @@
 extern Ge_creator ge_creator;
 extern Le_creator le_creator;
 extern char language[FN_REFLEN], reg_ext[FN_EXTLEN];
+extern uint reg_ext_length;
 extern char glob_hostname[FN_REFLEN], mysql_home[FN_REFLEN];
 extern char pidfile_name[FN_REFLEN], system_time_zone[30], *opt_init_file;
 extern char log_error_file[FN_REFLEN], *opt_tc_log_file;
@@ -1499,6 +1500,23 @@
 char *get_field(MEM_ROOT *mem, Field *field);
 bool get_field(MEM_ROOT *mem, Field *field, class String *res);
 int wild_case_compare(CHARSET_INFO *cs, const char *str,const char *wildstr);
+char *fn_rext(char *name);
+
+/* Conversion functions */
+uint strconvert(CHARSET_INFO *from_cs, const char *from,
+                CHARSET_INFO *to_cs, char *to, uint to_length);
+uint build_table_filename(char *buff, size_t bufflen, const char *db,
+                          const char *table, const char *ext);
+inline uint filename_to_tablename(const char *from, char *to, uint to_length)
+{
+  return strconvert(&my_charset_filename, from,
+                    system_charset_info, to, to_length);
+}
+inline uint tablename_to_filename(const char *from, char *to, uint to_length)
+{
+  return strconvert(system_charset_info, from,
+                    &my_charset_filename, to, to_length);
+}
 
 /* from hostname.cc */
 struct in_addr;

--- 1.509/sql/mysqld.cc	2005-12-29 14:02:03 +04:00
+++ 1.510/sql/mysqld.cc	2005-12-31 08:54:03 +04:00
@@ -511,7 +511,7 @@
      language[FN_REFLEN], reg_ext[FN_EXTLEN], mysql_charsets_dir[FN_REFLEN],
      *opt_init_file, *opt_tc_log_file,
      def_ft_boolean_syntax[sizeof(ft_boolean_syntax)];
-
+uint reg_ext_length;
 const key_map key_map_empty(0);
 key_map key_map_full(0);                        // Will be initialized later
 
@@ -7455,7 +7455,7 @@
     dir=tmp_path;
   }
   return !fn_format(to, name, dir, extension,
-		    MY_REPLACE_EXT | MY_UNPACK_FILENAME | MY_SAFE_PATH);
+		    MY_APPEND_EXT | MY_UNPACK_FILENAME | MY_SAFE_PATH);
 }
 
 

--- 1.168/sql/sql_acl.cc	2005-12-28 17:45:54 +04:00
+++ 1.169/sql/sql_acl.cc	2005-12-31 08:54:28 +04:00
@@ -2796,9 +2796,10 @@
       if (!(rights & CREATE_ACL))
       {
         char buf[FN_REFLEN];
-        sprintf(buf,"%s/%s/%s.frm",mysql_data_home, table_list->db,
-                table_list->table_name);
-        fn_format(buf,buf,"","",4+16+32);
+        build_table_filename(buf, sizeof(buf), table_list->db,
+                             table_list->table_name, reg_ext);
+        fn_format(buf, buf, "", "", MY_UNPACK_FILENAME  | MY_RESOLVE_SYMLINKS |
+                                    MY_RETURN_REAL_PATH | MY_APPEND_EXT);
         if (access(buf,F_OK))
         {
           my_error(ER_NO_SUCH_TABLE, MYF(0), table_list->db, table_list->alias);

--- 1.291/sql/sql_base.cc	2005-12-28 20:47:55 +04:00
+++ 1.292/sql/sql_base.cc	2005-12-31 08:54:30 +04:00
@@ -1819,9 +1819,8 @@
     {
       char path[FN_REFLEN];
       enum legacy_db_type not_used;
-      strxnmov(path, FN_REFLEN-1, mysql_data_home, "/", table_list->db, "/",
-               table_list->table_name, reg_ext, NullS);
-      (void) unpack_filename(path, path);
+      build_table_filename(path, sizeof(path) - 1,
+                           table_list->db, table_list->table_name, reg_ext);
       if (mysql_frm_type(thd, path, &not_used) == FRMTYPE_VIEW)
       {
         /*

--- 1.122/sql/sql_db.cc	2005-12-12 23:55:13 +04:00
+++ 1.123/sql/sql_db.cc	2005-12-31 08:54:32 +04:00
@@ -425,8 +425,7 @@
   }
 
   /* Check directory */
-  strxmov(path, mysql_data_home, "/", db, NullS);
-  path_len= unpack_dirname(path,path);    // Convert if not unix
+  path_len= build_table_filename(path, sizeof(path), db, "", "");
   path[path_len-1]= 0;                    // Remove last '/' from path
 
   if (my_stat(path,&stat_info,MYF(0)))
@@ -549,9 +548,12 @@
   if ((error=wait_if_global_read_lock(thd,0,1)))
     goto exit2;
 
-  /* Check directory */
-  strxmov(path, mysql_data_home, "/", db, "/", MY_DB_OPT_FILE, NullS);
-  fn_format(path, path, "", "", MYF(MY_UNPACK_FILENAME));
+  /* 
+     Recreate db options file: /dbpath/.db.opt
+     We pass MY_DB_OPT_FILE as "extension" to avoid
+     "table name to file name" encoding.
+  */
+  build_table_filename(path, sizeof(path), db, "", MY_DB_OPT_FILE);
   if ((error=write_db_opt(thd, path, create_info)))
     goto exit;
 
@@ -629,8 +631,7 @@
     goto exit2;
   }
 
-  (void) sprintf(path,"%s/%s",mysql_data_home,db);
-  length= unpack_dirname(path,path);		// Convert if not unix
+  length= build_table_filename(path, sizeof(path), db, "", "");
   strmov(path+length, MY_DB_OPT_FILE);		// Append db option file name
   del_dbopt(path);				// Remove dboption hash entry
   path[length]= '\0';				// Remove file name
@@ -852,7 +853,8 @@
       found_other_files++;
       continue;
     }
-    extension= fn_ext(file->name);
+    if (!(extension= strrchr(file->name, '.')))
+      extension= strend(file->name);
     if (find_type(extension, &deletable_extentions,1+2) <= 0)
     {
       if (find_type(extension, ha_known_exts(),1+2) <= 0)
@@ -870,7 +872,9 @@
       if (!table_list)
 	goto err;
       table_list->db= (char*) (table_list+1);
-      strmov(table_list->table_name= strmov(table_list->db,db)+1, file->name);
+      table_list->table_name= strmov(table_list->db, db) + 1;
+      VOID(filename_to_tablename(file->name, table_list->table_name,
+                                 strlen(file->name) + 1));
       table_list->alias= table_list->table_name;	// If lower_case_table_names=2
       /* Link into list */
       (*tot_list_next)= table_list;
@@ -1151,8 +1155,7 @@
     }
   }
 #endif
-  (void) sprintf(path,"%s/%s",mysql_data_home,dbname);
-  length=unpack_dirname(path,path);		// Convert if not unix
+  length= build_table_filename(path, sizeof(path), dbname, "", "");
   if (length && path[length-1] == FN_LIBCHAR)
     path[length-1]=0;				// remove ending '\'
   if (my_access(path,F_OK))

--- 1.165/sql/sql_delete.cc	2005-12-28 20:47:55 +04:00
+++ 1.166/sql/sql_delete.cc	2005-12-31 08:54:34 +04:00
@@ -837,6 +837,7 @@
   char path[FN_REFLEN];
   TABLE *table;
   bool error;
+  uint path_length;
   DBUG_ENTER("mysql_truncate");
 
   bzero((char*) &create_info,sizeof(create_info));
@@ -867,9 +868,8 @@
     goto end;
   }
 
-  (void) sprintf(path,"%s/%s/%s%s",mysql_data_home,table_list->db,
-		 table_list->table_name,reg_ext);
-  fn_format(path, path, "", "", MY_UNPACK_FILENAME);
+  path_length= build_table_filename(path, sizeof(path), table_list->db,
+                                    table_list->table_name, reg_ext);
 
   if (!dont_send_ok)
   {
@@ -889,7 +889,8 @@
       DBUG_RETURN(TRUE);
   }
 
-  *fn_ext(path)=0;				// Remove the .frm extension
+  // Remove the .frm extension
+  *(path + path_length - reg_ext_length)= '\0';
   error= ha_create_table(thd, path, table_list->db, table_list->table_name,
                          &create_info, 1);
   query_cache_invalidate3(thd, table_list, 0);

--- 1.292/sql/sql_show.cc	2005-12-30 00:24:07 +04:00
+++ 1.293/sql/sql_show.cc	2005-12-31 08:54:38 +04:00
@@ -413,9 +413,14 @@
 
   for (i=0 ; i < (uint) dirp->number_off_files  ; i++)
   {
+    char uname[NAME_LEN*3+1];                   /* Unencoded name */
     file=dirp->dir_entry+i;
     if (dir)
     {                                           /* Return databases */
+      if ((file->name[0] == '.' && 
+          ((file->name[1] == '.' && file->name[2] == '\0') ||
+            file->name[1] == '\0')))
+        continue;                               /* . or .. */
 #ifdef USE_SYMDIR
       char *ext;
       char buff[FN_REFLEN];
@@ -432,17 +437,21 @@
                continue;
        }
 #endif
-        if (file->name[0] == '.' || !MY_S_ISDIR(file->mystat->st_mode) ||
-            (wild && wild_compare(file->name,wild,0)))
-          continue;
+      VOID(filename_to_tablename(file->name, uname, sizeof(uname)));
+      if (!MY_S_ISDIR(file->mystat->st_mode) ||
+          (wild && wild_compare(uname, wild, 0)))
+        continue;
+      file->name= uname;
     }
     else
     {
         // Return only .frm files which aren't temp files.
-      if (my_strcasecmp(system_charset_info, ext=fn_ext(file->name),reg_ext) ||
+      if (my_strcasecmp(system_charset_info, ext=fn_rext(file->name),reg_ext) ||
           is_prefix(file->name,tmp_file_prefix))
         continue;
       *ext=0;
+      VOID(filename_to_tablename(file->name, uname, sizeof(uname)));
+      file->name= uname;
       if (wild)
       {
 	if (lower_case_table_names)
@@ -604,8 +613,7 @@
   }
   else
   {
-    (void) sprintf(path,"%s/%s",mysql_data_home, dbname);
-    length=unpack_dirname(path,path);		// Convert if not unix
+    length= build_table_filename(path, sizeof(path), dbname, "", "");
     found_libchar= 0;
     if (length && path[length-1] == FN_LIBCHAR)
     {
@@ -883,7 +891,7 @@
                   HA_CREATE_INFO *create_info_arg)
 {
   List<Item> field_list;
-  char tmp[MAX_FIELD_WIDTH], *for_str, buff[128], *end;
+  char tmp[MAX_FIELD_WIDTH], *for_str, buff[128], *end, uname[NAME_LEN*3+1];
   const char *alias;
   String type(tmp, sizeof(tmp), system_charset_info);
   Field **ptr,*field;
@@ -914,8 +922,14 @@
   if (table_list->schema_table)
     alias= table_list->schema_table->table_name;
   else
-    alias= (lower_case_table_names == 2 ? table->alias :
-            share->table_name.str);
+  {
+    if (lower_case_table_names == 2)
+      alias= table->alias;
+    else
+    {
+      alias= share->table_name.str;
+    }
+  }
   append_identifier(thd, packet, alias, strlen(alias));
   packet->append(STRING_WITH_LEN(" (\n"));
 
@@ -2312,8 +2326,8 @@
       }
       else
       {
-        strxmov(path, mysql_data_home, "/", base_name, NullS);
-        end= path + (len= unpack_dirname(path,path));
+        len= build_table_filename(path, sizeof(path), base_name, "", "");
+        end= path + len;
         len= FN_LEN - len;
         if (mysql_find_files(thd, &files, base_name, 
                              path, idx_field_vals.table_value, 0))
@@ -2460,8 +2474,7 @@
 	(grant_option && !check_grant_db(thd, file_name)))
 #endif
     {
-      strxmov(path, mysql_data_home, "/", file_name, NullS);
-      length=unpack_dirname(path,path);		// Convert if not unix
+      length= build_table_filename(path, sizeof(path), file_name, "", "");
       found_libchar= 0;
       if (length && path[length-1] == FN_LIBCHAR)
       {

--- 1.288/sql/sql_table.cc	2005-12-28 16:05:20 +04:00
+++ 1.289/sql/sql_table.cc	2005-12-31 08:54:40 +04:00
@@ -103,28 +103,53 @@
 }
 
 /*
- Build the path to a file for a table (or the base path that can
- then have various extensions stuck on to it).
+  Creates path to a file: mysql_data_dir/db/table.ext
 
   SYNOPSIS
-   build_table_path()
-   buff                 Buffer to build the path into
-   bufflen              sizeof(buff)
-   db                   Name of database
-   table                Name of table
-   ext                  Filename extension
+   build_table_filename()
+   buff			where to write result
+   bufflen              buff size
+   db                   database name, in system_charset_info
+   table                table name, in system_charset_info
+   ext                  file extension
+
+  NOTES
+
+    Uses database and table name, and extension to create
+    a file name in mysql_data_dir. Database and table
+    names are converted from system_charset_info into "fscs".
+    'ext' is not converted.
 
   RETURN
-    0                   Error
-    #                   Size of path
- */
 
-static uint build_table_path(char *buff, size_t bufflen, const char *db,
+*/
+
+
+uint build_table_filename(char *buff, size_t bufflen, const char *db,
+                          const char *table, const char *ext)
+{
+  uint length;
+  char dbbuff[FN_REFLEN];
+  char tbbuff[FN_REFLEN];
+  VOID(tablename_to_filename(table, tbbuff, sizeof(tbbuff)));
+  VOID(tablename_to_filename(db, dbbuff, sizeof(dbbuff)));
+  strxnmov(buff, bufflen,
+           mysql_data_home, "/", dbbuff, "/", tbbuff, ext, NullS);
+  length= unpack_filename(buff, buff);
+  return length;
+}
+
+
+uint build_tmptable_filename(char *buff, size_t bufflen,
+                             const char *tmpdir,
                              const char *table, const char *ext)
 {
-  strxnmov(buff, bufflen-1, mysql_data_home, "/", db, "/", table, ext,
-           NullS);
-  return unpack_filename(buff,buff);
+  uint length;
+  char tbbuff[FN_REFLEN];
+  VOID(tablename_to_filename(table, tbbuff, sizeof(tbbuff)));
+  strxnmov(buff, bufflen, tmpdir, "/", tbbuff, ext, NullS);
+  length= unpack_filename(buff, buff);
+  return length;
 }
 
 
@@ -276,7 +301,8 @@
 			 bool dont_log_query)
 {
   TABLE_LIST *table;
-  char	path[FN_REFLEN], *alias;
+  char path[FN_REFLEN], *alias;
+  uint path_length;
   String wrong_tables;
   int error;
   int non_temp_tables_count= 0;
@@ -365,7 +391,8 @@
       }
       alias= (lower_case_table_names == 2) ? table->alias : table->table_name;
       /* remove .frm file and engine files */
-      build_table_path(path, sizeof(path), db, alias, reg_ext);
+      path_length= build_table_filename(path, sizeof(path),
+                                        db, alias, reg_ext);
     }
     if (table_type == NULL &&
         (drop_temporary ||
@@ -390,7 +417,8 @@
 	mysql_frm_type(thd, path, &frm_db_type);
         table_type= ha_resolve_by_legacy_type(thd, frm_db_type);
       }
-      *(end=fn_ext(path))=0;			// Remove extension for delete
+      // Remove extension for delete
+      *(end= path + path_length - reg_ext_length)= '\0';
       error= ha_delete_table(thd, table_type, path, db, table->table_name,
                              !dont_log_query);
       if ((error == ENOENT || error == HA_ERR_NO_SUCH_TABLE) && 
@@ -495,10 +523,11 @@
   bool error= 0;
   DBUG_ENTER("quick_rm_table");
 
-  build_table_path(path, sizeof(path), db, table_name, reg_ext);
+  uint path_length= build_table_filename(path, sizeof(path),
+                                         db, table_name, reg_ext);
   if (my_delete(path,MYF(0)))
     error= 1; /* purecov: inspected */
-  *fn_ext(path)= 0;                             // Remove reg_ext
+  path[path_length - reg_ext_length]= '\0'; // Remove reg_ext
   DBUG_RETURN(ha_delete_table(current_thd, base, path, db, table_name, 0) ||
               error);
 }
@@ -1562,8 +1591,8 @@
   {
     HA_CREATE_INFO db_info;
     char path[FN_REFLEN];
-    /* Abuse build_table_path() to build the path to the db.opt file */
-    build_table_path(path, sizeof(path), db, MY_DB_OPT_FILE, "");
+    /* Abuse build_table_filename() to build the path to the db.opt file */
+    build_table_filename(path, sizeof(path), db, "", MY_DB_OPT_FILE);
     load_db_opt(thd, path, &db_info);
     create_info->default_table_charset= db_info.default_table_charset;
   }
@@ -1707,6 +1736,7 @@
                         uint select_field_count)
 {
   char		path[FN_REFLEN];
+  uint          path_length;
   const char	*alias;
   uint		db_options, key_count;
   KEY		*key_info_buffer;
@@ -1822,15 +1852,18 @@
       /* Check if table exists */
   if (create_info->options & HA_LEX_CREATE_TMP_TABLE)
   {
-    my_snprintf(path, sizeof(path), "%s%s%lx_%lx_%x%s",
-		mysql_tmpdir, tmp_file_prefix, current_pid, thd->thread_id,
-		thd->tmp_table++, reg_ext);
+    char tmp_table_name[tmp_file_prefix_length+22+22+22+3];
+    my_snprintf(tmp_table_name, sizeof(tmp_table_name), "%s%lx_%lx_%x",
+		tmp_file_prefix, current_pid, thd->thread_id,
+		thd->tmp_table++);
+    path_length= build_tmptable_filename(path, sizeof(path), mysql_tmpdir,
+                                         tmp_table_name, reg_ext);
     if (lower_case_table_names)
       my_casedn_str(files_charset_info, path);
     create_info->table_options|=HA_CREATE_DELAY_KEY_WRITE;
   }
   else
-    build_table_path(path, sizeof(path), db, alias, reg_ext);
+    path_length= build_table_filename(path, sizeof(path), db, alias, reg_ext);
 
   /* Check if table already exists */
   if ((create_info->options & HA_LEX_CREATE_TMP_TABLE) &&
@@ -1894,6 +1927,7 @@
     create_info->data_file_name= create_info->index_file_name= 0;
   create_info->table_options=db_options;
 
+  path[path_length - reg_ext_length]= '\0'; // Remove .frm extension
   if (rea_create_table(thd, path, db, table_name, create_info, fields,
                        key_count, key_info_buffer, file))
     goto unlock_and_end;
@@ -1901,7 +1935,6 @@
   if (create_info->options & HA_LEX_CREATE_TMP_TABLE)
   {
     /* Open table and put in temporary table list */
-    *fn_ext(path)= 0;
     if (!(open_temporary_table(thd, path, db, table_name, 1)))
     {
       (void) rm_temporary_table(create_info->db_type, path);
@@ -2105,8 +2138,8 @@
   file= (base == NULL ? 0 :
          get_new_handler((TABLE_SHARE*) 0, thd->mem_root, base));
 
-  build_table_path(from, sizeof(from), old_db, old_name, "");
-  build_table_path(to, sizeof(to), new_db, new_name, "");
+  build_table_filename(from, sizeof(from), old_db, old_name, "");
+  build_table_filename(to, sizeof(to), new_db, new_name, "");
 
   /*
     If lower_case_table_names == 2 (case-preserving but case-insensitive
@@ -2118,12 +2151,12 @@
   {
     strmov(tmp_name, old_name);
     my_casedn_str(files_charset_info, tmp_name);
-    build_table_path(lc_from, sizeof(lc_from), old_db, tmp_name, "");
+    build_table_filename(lc_from, sizeof(lc_from), old_db, tmp_name, "");
     from_base= lc_from;
 
     strmov(tmp_name, new_name);
     my_casedn_str(files_charset_info, tmp_name);
-    build_table_path(lc_to, sizeof(lc_to), new_db, tmp_name, "");
+    build_table_filename(lc_to, sizeof(lc_to), new_db, tmp_name, "");
     to_base= lc_to;
   }
 
@@ -2248,23 +2281,21 @@
   else
   {
     char* backup_dir= thd->lex->backup_dir;
-    char src_path[FN_REFLEN], dst_path[FN_REFLEN];
+    char src_path[FN_REFLEN], dst_path[FN_REFLEN], uname[FN_REFLEN];
     char* table_name= table->table_name;
     char* db= table->db;
 
-    if (fn_format_relative_to_data_home(src_path, table_name, backup_dir,
-					reg_ext))
+    VOID(tablename_to_filename(table->table_name, uname, sizeof(uname)));
+
+    if (fn_format_relative_to_data_home(src_path, uname, backup_dir, reg_ext))
       DBUG_RETURN(-1); // protect buffer overflow
 
-    my_snprintf(dst_path, sizeof(dst_path), "%s%s/%s",
-		mysql_real_data_home, db, table_name);
+    build_table_filename(dst_path, sizeof(dst_path), db, table_name, reg_ext);
 
     if (lock_and_wait_for_table_name(thd,table))
       DBUG_RETURN(-1);
 
-    if (my_copy(src_path,
-		fn_format(dst_path, dst_path,"", reg_ext, 4),
-		MYF(MY_WME)))
+    if (my_copy(src_path, dst_path, MYF(MY_WME)))
     {
       pthread_mutex_lock(&LOCK_open);
       unlock_table_name(thd, table);
@@ -2937,6 +2968,7 @@
 {
   TABLE *tmp_table;
   char src_path[FN_REFLEN], dst_path[FN_REFLEN];
+  uint dst_path_length;
   char *db= table->db;
   char *table_name= table->table_name;
   char *src_db;
@@ -2976,8 +3008,8 @@
     strxmov(src_path, tmp_table->s->path.str, reg_ext, NullS);
   else
   {
-    strxmov(src_path, mysql_data_home, "/", src_db, "/", src_table,
-	    reg_ext, NullS);
+    build_table_filename(src_path, sizeof(src_path),
+                         src_db, src_table, reg_ext);
     /* Resolve symlinks (for windows) */
     unpack_filename(src_path, src_path);
     if (lower_case_table_names)
@@ -3008,18 +3040,18 @@
   {
     if (find_temporary_table(thd, db, table_name))
       goto table_exists;
-    my_snprintf(dst_path, sizeof(dst_path), "%s%s%lx_%lx_%x%s",
-		mysql_tmpdir, tmp_file_prefix, current_pid,
-		thd->thread_id, thd->tmp_table++, reg_ext);
+    dst_path_length= my_snprintf(dst_path, sizeof(dst_path),
+                                 "%s%s%lx_%lx_%x%s",
+                                 mysql_tmpdir, tmp_file_prefix, current_pid,
+                                 thd->thread_id, thd->tmp_table++, reg_ext);
     if (lower_case_table_names)
       my_casedn_str(files_charset_info, dst_path);
     create_info->table_options|= HA_CREATE_DELAY_KEY_WRITE;
   }
   else
   {
-    strxmov(dst_path, mysql_data_home, "/", db, "/", table_name,
-	    reg_ext, NullS);
-    unpack_filename(dst_path, dst_path);
+    dst_path_length= build_table_filename(dst_path, sizeof(dst_path),
+                                          db, table_name, reg_ext);
     if (!access(dst_path, F_OK))
       goto table_exists;
   }
@@ -3041,7 +3073,7 @@
     creation, instead create the table directly (for both normal
     and temporary tables).
   */
-  *fn_ext(dst_path)= 0;                         // Remove .frm
+  dst_path[dst_path_length - reg_ext_length]= '\0';  // Remove .frm
   err= ha_create_table(thd, dst_path, db, table_name, create_info, 1);
 
   if (create_info->options & HA_LEX_CREATE_TMP_TABLE)
@@ -3324,10 +3356,10 @@
   else
   {
     if (table->file->add_index(table, key_info_buffer, key_count)||
-        build_table_path(path, sizeof(path), table_list->db,
-                         (lower_case_table_names == 2) ?
-                         table_list->alias : table_list->table_name,
-                         reg_ext) == 0 ||
+        build_table_filename(path, sizeof(path), table_list->db,
+                             (lower_case_table_names == 2) ?
+                             table_list->alias : table_list->table_name,
+                             reg_ext) == 0 ||
 	mysql_create_frm(thd, path, &create_info,
 			 fields, key_count, key_info_buffer, table->file))
       /* don't need to free((gptr) key_info_buffer);*/
@@ -3425,10 +3457,10 @@
 			    &keys, /*tmp_table*/ 0, &db_options, table->file,
 			    &key_info_buffer, key_count,
 			    /*select_field_count*/ 0)||
-        build_table_path(path, sizeof(path), table_list->db,
-                         (lower_case_table_names == 2) ?
-                         table_list->alias : table_list->table_name,
-                         reg_ext) == 0 ||
+        build_table_filename(path, sizeof(path), table_list->db,
+                             (lower_case_table_names == 2) ?
+                             table_list->alias : table_list->table_name,
+                             reg_ext) == 0 ||
 	mysql_create_frm(thd, path, &create_info,
 			 fields, key_count, key_info_buffer, table->file))
       /*don't need to free((gptr) key_numbers);*/
@@ -4532,7 +4564,7 @@
       */
       uint old_lock_type;
       partition_info *part_info= table->part_info;
-      char path[FN_REFLEN+1];
+      char path[FN_REFLEN+1], noext_path[FN_REFLEN+1];
       uint db_options= 0, key_count, syntax_len;
       KEY *key_info_buffer;
       char *part_syntax_buf;
@@ -4555,7 +4587,7 @@
       }
       part_info->part_info_string= part_syntax_buf;
       part_info->part_info_len= syntax_len;
-      build_table_path(path, sizeof(path), db, table_name, reg_ext);
+      build_table_filename(path, sizeof(path), db, table_name, reg_ext);
       if (mysql_create_frm(thd, path, db, table_name, create_info,
                            create_list, key_count, key_info_buffer,
                            table->file))
@@ -4563,7 +4595,7 @@
         DBUG_RETURN(TRUE);
       }
       thd->lex->part_info= part_info;
-      build_table_path(path, sizeof(path), db, table_name, "");
+      build_table_filename(path, sizeof(path), db, table_name, "");
       if (table->file->drop_partitions(path))
       {
         DBUG_RETURN(TRUE);
@@ -4591,11 +4623,12 @@
       }
       part_info->part_info_string= part_syntax_buf;
       part_info->part_info_len= syntax_len;
-      build_table_path(path, sizeof(path), db, table_name, reg_ext);
+      build_table_filename(path, sizeof(path), db, table_name, reg_ext);
+      build_table_filename(noext_path, sizeof(noext_path), db, table_name, "");
       if (mysql_create_frm(thd, path, db, table_name, create_info,
                            create_list, key_count, key_info_buffer,
                            table->file)  ||
-          table->file->create_handler_files(path))
+          table->file->create_handler_files(noext_path))
       {
         DBUG_RETURN(TRUE);
       }
@@ -4688,9 +4721,7 @@
     {
       char path[FN_REFLEN];
       /* table is a normal table: Create temporary table in same directory */
-      strxnmov(path, sizeof(path)-1, mysql_data_home, "/",new_db, "/",
-               tmp_name, NullS);
-      unpack_filename(path, path);
+      build_table_filename(path, sizeof(path), new_db, tmp_name, "");
       new_table=open_temporary_table(thd, path, new_db, tmp_name,0);
     }
     if (!new_table)
@@ -4906,7 +4937,7 @@
       shutdown.
     */
     char path[FN_REFLEN];
-    build_table_path(path, sizeof(path), new_db, table_name, "");
+    build_table_filename(path, sizeof(path), new_db, table_name, "");
     table=open_temporary_table(thd, path, new_db, tmp_name,0);
     if (table)
     {

--- 1.196/sql/table.cc	2005-12-22 08:10:56 +04:00
+++ 1.197/sql/table.cc	2005-12-31 08:54:48 +04:00
@@ -43,6 +43,37 @@
 }
 
 
+
+/*
+  Returns pointer to '.frm' extension of the file name.
+
+  SYNOPSIS
+    fn_rext()
+    name       file name
+
+  DESCRIPTION
+    Checks file name part starting with the rightmost '.' character,
+    and returns it if it is equal to '.frm'. 
+
+  TODO
+    It is a good idea to get rid of this function modifying the code
+    to garantee that the functions presently calling fn_rext() always
+    get arguments in the same format: either with '.frm' or without '.frm'.
+
+  RETURN VALUES
+    Pointer to the '.frm' extension. If there is no extension,
+    or extension is not '.frm', pointer at the end of file name.
+*/
+
+char *fn_rext(char *name)
+{
+  char *res= strrchr(name, '.');
+  if (res && !strcmp(res, ".frm"))
+    return res;
+  return name + strlen(name);
+}
+
+
 /*
   Allocate a setup TABLE_SHARE structure
 
@@ -65,9 +96,13 @@
   char path[FN_REFLEN], normalized_path[FN_REFLEN];
   uint path_length, normalized_length;
 
-  path_length= (uint) (strxmov(path, mysql_data_home, "/", table_list->db,
-                               "/", table_list->table_name, NullS) - path);
-  normalized_length= unpack_filename(normalized_path, path);
+  path_length= build_table_filename(path, sizeof(path) - 1,
+                                    table_list->db,
+                                    table_list->table_name, "");
+  normalized_length= build_table_filename(normalized_path,
+                                          sizeof(normalized_path) - 1,
+                                          table_list->db,
+                                          table_list->table_name, "");
 
   init_sql_alloc(&mem_root, TABLE_ALLOC_BLOCK_SIZE, 0);
   if ((share= (TABLE_SHARE*) alloc_root(&mem_root,
@@ -1883,6 +1918,7 @@
   res->append('\'');
 }
 
+
 	/* Create a .frm file */
 
 File create_frm(THD *thd, const char *name, const char *db,
@@ -2103,9 +2139,6 @@
 #else
     last_char_is_space= *name==' ';
 #endif
-    if (*name == '/' || *name == '\\' || *name == FN_LIBCHAR ||
-	*name == FN_EXTCHAR)
-      return 1;
     name++;
   }
   return last_char_is_space || (uint) (name - start) > NAME_LEN;
@@ -2114,8 +2147,7 @@
 
 /*
   Allow anything as a table name, as long as it doesn't contain an
-  a '/', or a '.' character
-  or ' ' at the end
+  ' ' at the end
   returns 1 on error
 */
 
@@ -2146,8 +2178,6 @@
       }
     }
 #endif
-    if (*name == '/' || *name == '\\' || *name == FN_EXTCHAR)
-      return 1;
     name++;
   }
 #if defined(USE_MB) && defined(USE_MB_IDENT)

--- 1.71/sql/unireg.cc	2005-12-21 22:18:30 +04:00
+++ 1.72/sql/unireg.cc	2005-12-31 08:54:50 +04:00
@@ -93,6 +93,7 @@
   thd->lex->part_info= NULL;
 #endif
 
+  DBUG_ASSERT(*fn_rext((char*)file_name)); // Check .frm extension
   formnames.type_names=0;
   if (!(screen_buff=pack_screens(create_fields,&info_length,&screens,0)))
     DBUG_RETURN(1);
@@ -289,7 +290,7 @@
   SYNOPSIS
     rea_create_table()
     thd			Thread handler
-    path		Name of file (including database and .frm)
+    path		Name of file (including database, without .frm)
     db			Data base name
     table_name		Table name
     create_info		create info parameters
@@ -309,25 +310,26 @@
                      List<create_field> &create_fields,
                      uint keys, KEY *key_info, handler *file)
 {
-  char *ext;
   DBUG_ENTER("rea_create_table");
 
-  if (mysql_create_frm(thd, path, db, table_name, create_info,
+  char frm_name[FN_REFLEN];
+  strxmov(frm_name, path, reg_ext, NullS);
+  if (mysql_create_frm(thd, frm_name, db, table_name, create_info,
                        create_fields, keys, key_info, file))
+
     DBUG_RETURN(1);
+
+  // Make sure mysql_create_frm din't remove extension
+  DBUG_ASSERT(*fn_rext(frm_name));
   if (file->create_handler_files(path))
     goto err_handler;
-  *(ext= fn_ext(path))= 0;                             // Remove .frm
   if (!create_info->frm_only && ha_create_table(thd, path, db, table_name,
                                                 create_info,0))
-  {
-    *ext= FN_EXTCHAR;                           // Add extension back
     goto err_handler;
-  }
   DBUG_RETURN(0);
 
 err_handler:
-  my_delete(path, MYF(0));
+  my_delete(frm_name, MYF(0));
   DBUG_RETURN(1);
 } /* rea_create_table */
 

--- 1.97/strings/ctype-utf8.c	2005-10-13 19:10:14 +05:00
+++ 1.98/strings/ctype-utf8.c	2005-12-31 08:56:53 +04:00
@@ -2791,6 +2791,1293 @@
 #endif	/* Cybozu Hack */
 
 
+/*
+  File system encoding components:
+
+Code range Pattern            Number   Used Unused  Blocks
+-----------------------------------------------------------------------------
+00C0..017F [.][0..4][g..z] 5*20= 100   97     3  Latin1 Supplement + Ext A
+0370..03FF [.][5..9][g..z] 5*20= 100   88    12  Greek + Coptic
+0400..052F [.][g..z][0..6] 20*7= 140  140   137  Cyrillic
+0530..058F [.][g..z][7..8] 20*2=  40   38     2  Armenian
+2160..217F [.][g..z][9]    20*1=  20   16     4  Number Forms
+0180..02AF [.][g..z][a..k] 28*11=220  203    17  Latin Ext B + IPA
+1E00..0EFF [.][g..z][l..r] 20*7= 140  136     4  Latin Additional Extended
+1F00..1FFF [.][g..z][s..z] 20*8= 160  144    16  Greek Extended
+....  .... [.][a..f][g..z] 6*20= 120    0   120  RESERVED
+24B6..24E9 [.][@][a..z]           26   26     0  Enclosed Alphanumerics
+FF21..FF5A [.][a..z][@]           26   26     0  Full Width forms
+
+All other characters are encoded using five bytes:
+
+[.][0..9a..z][0..9a..z][0..9a..z][0..9a..z]
+
+*/
+
+
+static uint16 touni[5994]=
+{
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00C0,
+  0x00C1,0x00C2,0x00C3,0x00C4,0x00C5,0x00C6,0x00C7,0x00C8,
+  0x00C9,0x00CA,0x00CB,0x00CC,0x00CD,0x00CE,0x00CF,0x00D0,
+  0x00D1,0x00D2,0x00D3,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00E0,
+  0x00E1,0x00E2,0x00E3,0x00E4,0x00E5,0x00E6,0x00E7,0x00E8,
+  0x00E9,0x00EA,0x00EB,0x00EC,0x00ED,0x00EE,0x00EF,0x00F0,
+  0x00F1,0x00F2,0x00F3,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,0x00D4,
+  0x00D5,0x00D6,0x0000,0x00D8,0x00D9,0x00DA,0x00DB,0x00DC,
+  0x00DD,0x00DE,0x0178,0x0100,0x0102,0x0104,0x0106,0x0108,
+  0x010A,0x010C,0x010E,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00F4,
+  0x00F5,0x00F6,0x00DF,0x00F8,0x00F9,0x00FA,0x00FB,0x00FC,
+  0x00FD,0x00FE,0x00FF,0x0101,0x0103,0x0105,0x0107,0x0109,
+  0x010B,0x010D,0x010F,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,0x0110,
+  0x0112,0x0114,0x0116,0x0118,0x011A,0x011C,0x011E,0x0120,
+  0x0122,0x0124,0x0126,0x0128,0x012A,0x012C,0x012E,0x0000,
+  0x0132,0x0134,0x0136,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0111,
+  0x0113,0x0115,0x0117,0x0119,0x011B,0x011D,0x011F,0x0121,
+  0x0123,0x0125,0x0127,0x0129,0x012B,0x012D,0x012F,0x0131,
+  0x0133,0x0135,0x0137,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,
+  0x0139,0x013B,0x013D,0x013F,0x0141,0x0143,0x0145,0x0147,
+  0x0000,0x014A,0x014C,0x014E,0x0150,0x0152,0x0154,0x0156,
+  0x0158,0x015A,0x015C,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0138,
+  0x013A,0x013C,0x013E,0x0140,0x0142,0x0144,0x0146,0x0148,
+  0x0149,0x014B,0x014D,0x014F,0x0151,0x0153,0x0155,0x0157,
+  0x0159,0x015B,0x015D,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,0x015E,
+  0x0160,0x0162,0x0164,0x0166,0x0168,0x016A,0x016C,0x016E,
+  0x0170,0x0172,0x0174,0x0176,0x0179,0x017B,0x017D,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x015F,
+  0x0161,0x0163,0x0165,0x0167,0x0169,0x016B,0x016D,0x016F,
+  0x0171,0x0173,0x0175,0x0177,0x017A,0x017C,0x017E,0x017F,
+  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,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,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0000,0x0390,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,0x0386,
+  0x0388,0x0389,0x038A,0x0000,0x0391,0x0000,0x0393,0x0394,
+  0x0395,0x0396,0x0397,0x0000,0x0399,0x0000,0x039B,0x039C,
+  0x039D,0x039E,0x039F,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03AC,
+  0x03AD,0x03AE,0x03AF,0x03B0,0x03B1,0x03B2,0x03B3,0x03B4,
+  0x03B5,0x03B6,0x03B7,0x03B8,0x03B9,0x03BA,0x03BB,0x03BC,
+  0x03BD,0x03BE,0x03BF,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,
+  0x03A1,0x0000,0x0000,0x03A4,0x03A5,0x0000,0x03A7,0x03A8,
+  0x03A9,0x03AA,0x03AB,0x038C,0x038E,0x038F,0x0000,0x0392,
+  0x0398,0x03D2,0x03D3,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03C0,
+  0x03C1,0x03C2,0x03C3,0x03C4,0x03C5,0x03C6,0x03C7,0x03C8,
+  0x03C9,0x03CA,0x03CB,0x03CC,0x03CD,0x03CE,0x0000,0x03D0,
+  0x03D1,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,0x03D4,
+  0x03A6,0x03A0,0x0000,0x0000,0x03DA,0x03DC,0x03DE,0x03E0,
+  0x03E2,0x03E4,0x03E6,0x03E8,0x03EA,0x03EC,0x03EE,0x039A,
+  0x0000,0x03A3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x03D5,0x03D6,0x03D7,0x03D9,0x03DB,0x03DD,0x03DF,0x03E1,
+  0x03E3,0x03E5,0x03E7,0x03E9,0x03EB,0x03ED,0x03EF,0x03F0,
+  0x03F1,0x03F2,0x03F3,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,0x03FD,0x03FE,0x03FF,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03F5,
+  0x03F6,0x03F8,0x03FB,0x03FC,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,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,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,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,
+  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,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,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,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,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,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,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,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,
+  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,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,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,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0000,0x24B6,0x24B7,0x24B8,0x24B9,0x24BA,0x24BB,0x24BC,
+  0x24BD,0x24BE,0x24BF,0x24C0,0x24C1,0x24C2,0x24C3,0x24C4,
+  0x24C5,0x24C6,0x24C7,0x24C8,0x24C9,0x24CA,0x24CB,0x24CC,
+  0x24CD,0x24CE,0x24CF,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0000,0x24D0,0x24D1,0x24D2,0x24D3,0x24D4,0x24D5,0x24D6,
+  0x24D7,0x24D8,0x24D9,0x24DA,0x24DB,0x24DC,0x24DD,0x24DE,
+  0x24DF,0x24E0,0x24E1,0x24E2,0x24E3,0x24E4,0x24E5,0x24E6,
+  0x24E7,0x24E8,0x24E9,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF21,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,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,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF22,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,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,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF23,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,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,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF24,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,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,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF25,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,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,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF26,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,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,
+  0x0410,0x0424,0x0408,0x0478,0x04A6,0x04CD,0x04F4,0x0000,
+  0x0544,0x2160,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF27,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,0x01B3,0x01DE,0x0208,0x0230,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x1E00,0x1E28,0x1E50,0x1E78,
+  0x1E60,0x1EBE,0x1EE6,0x1F08,0x1F2A,0x0000,0x1F6C,0x1F88,
+  0x1FAC,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0411,0x0425,0x0409,0x047A,0x04A8,0x0000,0x04F6,0x0531,
+  0x0545,0x2161,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF28,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,0x0182,0x01B5,0x01E0,0x020A,0x0232,0x0000,0x0000,
+  0x019D,0x0000,0x0000,0x0000,0x1E02,0x1E2A,0x1E52,0x1E7A,
+  0x0000,0x1EC0,0x1EE8,0x1F09,0x1F2B,0x0000,0x1F6D,0x1F89,
+  0x1FAD,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0412,0x0426,0x040A,0x047C,0x04AA,0x04D0,0x04F8,0x0532,
+  0x0546,0x2162,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF29,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,0x0184,0x01B8,0x01E2,0x020C,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x1E04,0x1E2C,0x1E54,0x1E7C,
+  0x0000,0x1EC2,0x1EEA,0x1F0A,0x1F2C,0x0000,0x1F6E,0x1F8A,
+  0x1FAE,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0413,0x0427,0x040B,0x047E,0x04AC,0x04D2,0x0000,0x0533,
+  0x0547,0x2163,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF2A,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,0x0187,0x0000,0x01E4,0x020E,0x0000,0x0000,0x0193,
+  0x0000,0x01AE,0x0000,0x0000,0x1E06,0x1E2E,0x1E56,0x1E7E,
+  0x0000,0x1EC4,0x1EEC,0x1F0B,0x1F2D,0x0000,0x1F6F,0x1F8B,
+  0x1FAF,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0414,0x0428,0x040C,0x0480,0x04AE,0x04D4,0x0000,0x0534,
+  0x0548,0x2164,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF2B,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,0x018B,0x0000,0x01E6,0x0210,0x0000,0x0000,0x0000,
+  0x019F,0x0000,0x0000,0x0000,0x1E08,0x1E30,0x1E58,0x1E80,
+  0x0000,0x1EC6,0x1EEE,0x1F0C,0x1F2E,0x0000,0x1FBA,0x1F8C,
+  0x1FB8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0415,0x0429,0x040D,0x0000,0x04B0,0x04D6,0x0000,0x0535,
+  0x0549,0x2165,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF2C,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,0x0000,0x01E8,0x0212,0x0000,0x0000,0x0000,
+  0x0000,0x01B1,0x0000,0x0000,0x1E0A,0x1E32,0x1E5A,0x1E82,
+  0x1EA0,0x1EC8,0x1EF0,0x1F0D,0x1F2F,0x1F59,0x1FBB,0x1F8D,
+  0x1FB9,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0416,0x042A,0x040E,0x048A,0x04B2,0x04D8,0x0000,0x0536,
+  0x054A,0x2166,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF2D,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,0x0191,0x0000,0x01EA,0x0214,0x0000,0x0000,0x0194,
+  0x0000,0x01B2,0x0000,0x0000,0x1E0C,0x1E34,0x1E5C,0x1E84,
+  0x1EA2,0x1ECA,0x1EF2,0x1F0E,0x1F38,0x0000,0x1FC8,0x1F8E,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0417,0x042B,0x040F,0x048C,0x04B4,0x04DA,0x0000,0x0537,
+  0x054B,0x2167,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF2E,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,0x01F6,0x01BC,0x01EC,0x0216,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x1E0E,0x1E36,0x1E5E,0x1E86,
+  0x1EA4,0x1ECC,0x1EF4,0x1F0F,0x1F39,0x1F5B,0x1FC9,0x1F8F,
+  0x1FBC,0x1FE8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0418,0x042C,0x0460,0x048E,0x04B6,0x04DC,0x0000,0x0538,
+  0x054C,0x2168,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF2F,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,0x0198,0x01C4,0x01EE,0x0218,0x023A,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x1E10,0x1E38,0x0000,0x1E88,
+  0x1EA6,0x1ECE,0x1EF6,0x1F18,0x1F3A,0x0000,0x1FCA,0x1F98,
+  0x0000,0x1FE9,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0419,0x042D,0x0462,0x0490,0x04B8,0x04DE,0x0500,0x0539,
+  0x054D,0x2169,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF30,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,0x023D,0x01C7,0x0000,0x021A,0x023B,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x1E12,0x1E3A,0x1E62,0x1E8A,
+  0x1EA8,0x1ED0,0x1EF8,0x1F19,0x1F3B,0x1F5D,0x1FCB,0x1F99,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x041A,0x042E,0x0464,0x0492,0x04BA,0x04E0,0x0502,0x053A,
+  0x054E,0x216A,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF31,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,0x01CA,0x01F1,0x021C,0x023E,0x0181,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x1E14,0x1E3C,0x1E64,0x1E8C,
+  0x1EAA,0x1ED2,0x0000,0x1F1A,0x1F3C,0x0000,0x1FDA,0x1F9A,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x041B,0x042F,0x0466,0x0494,0x04BC,0x04E2,0x0504,0x053B,
+  0x054F,0x216B,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF32,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,0x0220,0x01CD,0x01F4,0x021E,0x0000,0x0186,0x0197,
+  0x0000,0x0000,0x0000,0x0000,0x1E16,0x1E3E,0x1E66,0x1E8E,
+  0x1EAC,0x1ED4,0x0000,0x1F1B,0x1F3D,0x1F5F,0x1FDB,0x1F9B,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x041C,0x0400,0x0468,0x0496,0x04BE,0x04E4,0x0506,0x053C,
+  0x0550,0x216C,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF33,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,0x01A0,0x01CF,0x01F8,0x0000,0x0000,0x0000,0x0196,
+  0x0000,0x0000,0x0000,0x0000,0x1E18,0x1E40,0x1E68,0x1E90,
+  0x1EAE,0x1ED6,0x0000,0x1F1C,0x1F3E,0x0000,0x1FF8,0x1F9C,
+  0x0000,0x1FEC,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x041D,0x0401,0x046A,0x0498,0x04C0,0x04E6,0x0508,0x053D,
+  0x0551,0x216D,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF34,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,0x01A2,0x01D1,0x01FA,0x0222,0x0000,0x0189,0x0000,
+  0x0000,0x01B7,0x0000,0x0000,0x1E1A,0x1E42,0x1E6A,0x1E92,
+  0x1EB0,0x1ED8,0x0000,0x1F1D,0x1F3F,0x0000,0x1FF9,0x1F9D,
+  0x1FCC,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x041E,0x0402,0x046C,0x049A,0x04C1,0x04E8,0x050A,0x053E,
+  0x0552,0x216E,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF35,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,0x01A4,0x01D3,0x01FC,0x0224,0x0000,0x018A,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x1E1C,0x1E44,0x1E6C,0x1E94,
+  0x1EB2,0x1EDA,0x0000,0x0000,0x1F48,0x0000,0x1FEA,0x1F9E,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x041F,0x0403,0x046E,0x049C,0x04C3,0x04EA,0x050C,0x053F,
+  0x0553,0x216F,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF36,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,0x01A7,0x01D5,0x01FE,0x0226,0x0000,0x0000,0x0000,
+  0x01A6,0x0241,0x0000,0x0000,0x1E1E,0x1E46,0x1E6E,0x0000,
+  0x1EB4,0x1EDC,0x0000,0x0000,0x1F49,0x0000,0x1FEB,0x1F9F,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0420,0x0404,0x0470,0x049E,0x04C5,0x04EC,0x050E,0x0540,
+  0x0554,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF37,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,0x01D7,0x0200,0x0228,0x0000,0x018F,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x1E20,0x1E48,0x1E70,0x0000,
+  0x1EB6,0x1EDE,0x0000,0x0000,0x1F4A,0x1F68,0x1FFA,0x1FA8,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0421,0x0405,0x0472,0x04A0,0x04C7,0x04EE,0x0000,0x0541,
+  0x0555,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF38,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,0x01D9,0x0202,0x022A,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x1E22,0x1E4A,0x1E72,0x0000,
+  0x1EB8,0x1EE0,0x0000,0x0000,0x1F4B,0x1F69,0x1FFB,0x1FA9,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0422,0x0406,0x0474,0x04A2,0x04C9,0x04F0,0x0000,0x0542,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF39,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,0x01AC,0x01DB,0x0204,0x022C,0x0000,0x0190,0x019C,
+  0x01A9,0x0000,0x0000,0x0000,0x1E24,0x1E4C,0x1E74,0x0000,
+  0x1EBA,0x1EE2,0x0000,0x1F28,0x1F4C,0x1F6A,0x0000,0x1FAA,
+  0x1FD8,0x1FFC,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0423,0x0407,0x0476,0x04A4,0x04CB,0x04F2,0x0000,0x0543,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF3A,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,0x01AF,0x018E,0x0206,0x022E,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x1E26,0x1E4E,0x1E76,0x0000,
+  0x1EBC,0x1EE4,0x0000,0x1F29,0x1F4D,0x1F6B,0x0000,0x1FAB,
+  0x1FD9,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,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,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,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,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,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,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,
+  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,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,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,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,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,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,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,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,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF41,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,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,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF42,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,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,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF43,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,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,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF44,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,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,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF45,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,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,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF46,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,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,
+  0x0430,0x0444,0x0458,0x0479,0x04A7,0x04CE,0x04F5,0x0000,
+  0x0574,0x2170,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF47,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,0x0180,0x01B4,0x01DF,0x0209,0x0231,0x0000,0x025D,
+  0x0271,0x0285,0x0299,0x02AD,0x1E01,0x1E29,0x1E51,0x1E79,
+  0x1E9B,0x1EBF,0x1EE7,0x1F00,0x1F22,0x0000,0x1F64,0x1F80,
+  0x1FA4,0x1FD2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0431,0x0445,0x0459,0x047B,0x04A9,0x0000,0x04F7,0x0561,
+  0x0575,0x2171,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF48,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,0x0183,0x01B6,0x01E1,0x020B,0x0233,0x0000,0x025E,
+  0x0272,0x0286,0x029A,0x02AE,0x1E03,0x1E2B,0x1E53,0x1E7B,
+  0x0000,0x1EC1,0x1EE9,0x1F01,0x1F23,0x0000,0x1F65,0x1F81,
+  0x1FA5,0x1FD3,0x1FF6,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0432,0x0446,0x045A,0x047D,0x04AB,0x04D1,0x04F9,0x0562,
+  0x0576,0x2172,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF49,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,0x0185,0x01B9,0x01E3,0x020D,0x0234,0x0000,0x025F,
+  0x0273,0x0287,0x029B,0x02AF,0x1E05,0x1E2D,0x1E55,0x1E7D,
+  0x0000,0x1EC3,0x1EEB,0x1F02,0x1F24,0x0000,0x1F66,0x1F82,
+  0x1FA6,0x0000,0x1FF7,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0433,0x0447,0x045B,0x047F,0x04AD,0x04D3,0x0000,0x0563,
+  0x0577,0x2173,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF4A,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,0x0188,0x01BA,0x01E5,0x020F,0x0235,0x0000,0x0260,
+  0x0274,0x0288,0x029C,0x0000,0x1E07,0x1E2F,0x1E57,0x1E7F,
+  0x0000,0x1EC5,0x1EED,0x1F03,0x1F25,0x0000,0x1F67,0x1F83,
+  0x1FA7,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0434,0x0448,0x045C,0x0481,0x04AF,0x04D5,0x0000,0x0564,
+  0x0578,0x2174,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF4B,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,0x018C,0x01BB,0x01E7,0x0211,0x0236,0x0000,0x0261,
+  0x0275,0x0289,0x029D,0x0000,0x1E09,0x1E31,0x1E59,0x1E81,
+  0x0000,0x1EC7,0x1EEF,0x1F04,0x1F26,0x1F50,0x1F70,0x1F84,
+  0x1FB0,0x1FD6,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0435,0x0449,0x045D,0x0000,0x04B1,0x04D7,0x0000,0x0565,
+  0x0579,0x2175,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF4C,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,0x018D,0x0000,0x01E9,0x0213,0x0237,0x0000,0x0262,
+  0x0276,0x028A,0x029E,0x0000,0x1E0B,0x1E33,0x1E5B,0x1E83,
+  0x1EA1,0x1EC9,0x1EF1,0x1F05,0x1F27,0x1F51,0x1F71,0x1F85,
+  0x1FB1,0x1FD7,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0436,0x044A,0x045E,0x048B,0x04B3,0x04D9,0x0000,0x0566,
+  0x057A,0x2176,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF4D,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,0x0192,0x01BE,0x01EB,0x0215,0x0238,0x0000,0x0263,
+  0x0277,0x028B,0x029F,0x0000,0x1E0D,0x1E35,0x1E5D,0x1E85,
+  0x1EA3,0x1ECB,0x1EF3,0x1F06,0x1F30,0x1F52,0x1F72,0x1F86,
+  0x1FB2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0437,0x044B,0x045F,0x048D,0x04B5,0x04DB,0x0000,0x0567,
+  0x057B,0x2177,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF4E,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,0x0195,0x01BD,0x01ED,0x0217,0x0239,0x0250,0x0264,
+  0x0278,0x028C,0x02A0,0x0000,0x1E0F,0x1E37,0x1E5F,0x1E87,
+  0x1EA5,0x1ECD,0x1EF5,0x1F07,0x1F31,0x1F53,0x1F73,0x1F87,
+  0x1FB3,0x1FE0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0438,0x044C,0x0461,0x048F,0x04B7,0x04DD,0x0000,0x0568,
+  0x057C,0x2178,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF4F,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,0x0199,0x01C6,0x01EF,0x0219,0x0000,0x0251,0x0265,
+  0x0279,0x028D,0x02A1,0x0000,0x1E11,0x1E39,0x1E61,0x1E89,
+  0x1EA7,0x1ECF,0x1EF7,0x1F10,0x1F32,0x1F54,0x1F74,0x1F90,
+  0x1FB4,0x1FE1,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0439,0x044D,0x0463,0x0491,0x04B9,0x04DF,0x0501,0x0569,
+  0x057D,0x2179,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF50,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,0x019A,0x01C9,0x01F0,0x021B,0x023C,0x0252,0x0266,
+  0x027A,0x028E,0x02A2,0x0000,0x1E13,0x1E3B,0x1E63,0x1E8B,
+  0x1EA9,0x1ED1,0x1EF9,0x1F11,0x1F33,0x1F55,0x1F75,0x1F91,
+  0x0000,0x1FE2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x043A,0x044E,0x0465,0x0493,0x04BB,0x04E1,0x0503,0x056A,
+  0x057E,0x217A,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF51,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,0x019B,0x01CC,0x01F3,0x021D,0x0000,0x0253,0x0267,
+  0x027B,0x028F,0x02A3,0x0000,0x1E15,0x1E3D,0x1E65,0x1E8D,
+  0x1EAB,0x1ED3,0x0000,0x1F12,0x1F34,0x1F56,0x1F76,0x1F92,
+  0x1FB6,0x1FE3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x043B,0x044F,0x0467,0x0495,0x04BD,0x04E3,0x0505,0x056B,
+  0x057F,0x217B,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF52,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,0x019E,0x01CE,0x01F5,0x021F,0x023F,0x0254,0x0268,
+  0x027C,0x0290,0x02A4,0x0000,0x1E17,0x1E3F,0x1E67,0x1E8F,
+  0x1EAD,0x1ED5,0x0000,0x1F13,0x1F35,0x1F57,0x1F77,0x1F93,
+  0x1FB7,0x1FE4,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x043C,0x0450,0x0469,0x0497,0x04BF,0x04E5,0x0507,0x056C,
+  0x0580,0x217C,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF53,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,0x01A1,0x01D0,0x01F9,0x0221,0x0240,0x0255,0x0269,
+  0x027D,0x0291,0x02A5,0x0000,0x1E19,0x1E41,0x1E69,0x1E91,
+  0x1EAF,0x1ED7,0x0000,0x1F14,0x1F36,0x0000,0x1F78,0x1F94,
+  0x1FC2,0x1FE5,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x043D,0x0451,0x046B,0x0499,0x0000,0x04E7,0x0509,0x056D,
+  0x0581,0x217D,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF54,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,0x01A3,0x01D2,0x01FB,0x0223,0x0000,0x0256,0x026A,
+  0x027E,0x0292,0x02A6,0x0000,0x1E1B,0x1E43,0x1E6B,0x1E93,
+  0x1EB1,0x1ED9,0x0000,0x1F15,0x1F37,0x0000,0x1F79,0x1F95,
+  0x1FC3,0x1FE6,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x043E,0x0452,0x046D,0x049B,0x04C2,0x04E9,0x050B,0x056E,
+  0x0582,0x217E,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF55,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,0x01A5,0x01D4,0x01FD,0x0225,0x0000,0x0257,0x026B,
+  0x027F,0x0293,0x02A7,0x0000,0x1E1D,0x1E45,0x1E6D,0x1E95,
+  0x1EB3,0x1EDB,0x0000,0x0000,0x1F40,0x0000,0x1F7A,0x1F96,
+  0x1FC4,0x1FE7,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x043F,0x0453,0x046F,0x049D,0x04C4,0x04EB,0x050D,0x056F,
+  0x0583,0x217F,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF56,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,0x01A8,0x01D6,0x01FF,0x0227,0x0000,0x0258,0x026C,
+  0x0280,0x0294,0x02A8,0x0000,0x1E1F,0x1E47,0x1E6F,0x1E96,
+  0x1EB5,0x1EDD,0x0000,0x0000,0x1F41,0x0000,0x1F7B,0x1F97,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0440,0x0454,0x0471,0x049F,0x04C6,0x04ED,0x050F,0x0570,
+  0x0584,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF57,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,0x01AA,0x01D8,0x0201,0x0229,0x0000,0x0259,0x026D,
+  0x0281,0x0295,0x02A9,0x0000,0x1E21,0x1E49,0x1E71,0x1E97,
+  0x1EB7,0x1EDF,0x0000,0x0000,0x1F42,0x1F60,0x1F7C,0x1FA0,
+  0x1FC6,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0441,0x0455,0x0473,0x04A1,0x04C8,0x04EF,0x0000,0x0571,
+  0x0585,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF58,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,0x01AB,0x01DA,0x0203,0x022B,0x0000,0x025A,0x026E,
+  0x0282,0x0296,0x02AA,0x0000,0x1E23,0x1E4B,0x1E73,0x1E98,
+  0x1EB9,0x1EE1,0x0000,0x0000,0x1F43,0x1F61,0x1F7D,0x1FA1,
+  0x1FC7,0x1FF2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0442,0x0456,0x0475,0x04A3,0x04CA,0x04F1,0x0000,0x0572,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF59,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,0x01AD,0x01DC,0x0205,0x022D,0x0000,0x025B,0x026F,
+  0x0283,0x0297,0x02AB,0x0000,0x1E25,0x1E4D,0x1E75,0x1E99,
+  0x1EBB,0x1EE3,0x0000,0x1F20,0x1F44,0x1F62,0x0000,0x1FA2,
+  0x1FD0,0x1FF3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0443,0x0457,0x0477,0x04A5,0x04CC,0x04F3,0x0000,0x0573,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0xFF5A,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,0x01B0,0x01DD,0x0207,0x022F,0x0000,0x025C,0x0270,
+  0x0284,0x0298,0x02AC,0x0000,0x1E27,0x1E4F,0x1E77,0x1E9A,
+  0x1EBD,0x1EE5,0x0000,0x1F21,0x1F45,0x1F63,0x0000,0x1FA3,
+  0x1FD1,0x1FF4
+};
+
+
+/* 00C0-05FF */
+static uint16 uni_0C00_05FF[1344]=
+{
+  0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,
+  0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,
+  0x0027,0x0028,0x0029,0x002A,0x0067,0x0068,0x0069,0x0000,
+  0x006B,0x006C,0x006D,0x006E,0x006F,0x0070,0x0071,0x008A,
+  0x0037,0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,
+  0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,
+  0x0047,0x0048,0x0049,0x004A,0x0087,0x0088,0x0089,0x0000,
+  0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,0x0092,
+  0x0073,0x0093,0x0074,0x0094,0x0075,0x0095,0x0076,0x0096,
+  0x0077,0x0097,0x0078,0x0098,0x0079,0x0099,0x007A,0x009A,
+  0x00B7,0x00D7,0x00B8,0x00D8,0x00B9,0x00D9,0x00BA,0x00DA,
+  0x00BB,0x00DB,0x00BC,0x00DC,0x00BD,0x00DD,0x00BE,0x00DE,
+  0x00BF,0x00DF,0x00C0,0x00E0,0x00C1,0x00E1,0x00C2,0x00E2,
+  0x00C3,0x00E3,0x00C4,0x00E4,0x00C5,0x00E5,0x00C6,0x00E6,
+  0x0000,0x00E7,0x00C8,0x00E8,0x00C9,0x00E9,0x00CA,0x00EA,
+  0x0127,0x0108,0x0128,0x0109,0x0129,0x010A,0x012A,0x010B,
+  0x012B,0x010C,0x012C,0x010D,0x012D,0x010E,0x012E,0x010F,
+  0x012F,0x0130,0x0111,0x0131,0x0112,0x0132,0x0113,0x0133,
+  0x0114,0x0134,0x0115,0x0135,0x0116,0x0136,0x0117,0x0137,
+  0x0118,0x0138,0x0119,0x0139,0x011A,0x013A,0x0157,0x0177,
+  0x0158,0x0178,0x0159,0x0179,0x015A,0x017A,0x015B,0x017B,
+  0x015C,0x017C,0x015D,0x017D,0x015E,0x017E,0x015F,0x017F,
+  0x0160,0x0180,0x0161,0x0181,0x0162,0x0182,0x0163,0x0183,
+  0x0072,0x0164,0x0184,0x0165,0x0185,0x0166,0x0186,0x0187,
+  0x1161,0x0A86,0x07B1,0x11B1,0x0801,0x1201,0x0AD6,0x0851,
+  0x1251,0x0B76,0x0BC6,0x08A1,0x12A1,0x12F1,0x0D52,0x0C66,
+  0x0D06,0x0941,0x1341,0x0857,0x0947,0x1391,0x0B27,0x0AD7,
+  0x09E1,0x13E1,0x1431,0x1481,0x0D07,0x07B8,0x14D1,0x08A8,
+  0x0B21,0x1521,0x0B71,0x1571,0x0BC1,0x15C1,0x0C18,0x0C11,
+  0x1611,0x0D08,0x1661,0x16B1,0x0D01,0x1701,0x0859,0x0D51,
+  0x1751,0x08F9,0x0949,0x0762,0x1162,0x07B2,0x11B2,0x0B79,
+  0x0802,0x1202,0x1252,0x12A2,0x0992,0x1392,0x1342,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x09E2,0x0000,0x13E2,0x0A32,
+  0x0000,0x1432,0x0A82,0x0000,0x1482,0x0AD2,0x14D2,0x0B22,
+  0x1522,0x0B72,0x1572,0x0BC2,0x15C2,0x0C12,0x1612,0x0C62,
+  0x1662,0x0CB2,0x16B2,0x0D02,0x1702,0x1752,0x0763,0x1163,
+  0x07B3,0x11B3,0x0803,0x1203,0x0853,0x1253,0x08A3,0x12A3,
+  0x08F3,0x12F3,0x0943,0x1343,0x0993,0x1393,0x09E3,0x13E3,
+  0x1433,0x0A83,0x0000,0x1483,0x0AD3,0x14D3,0x0991,0x0000,
+  0x0B23,0x1523,0x0B73,0x1573,0x0BC3,0x15C3,0x0C13,0x1613,
+  0x0C63,0x1663,0x0CB3,0x16B3,0x0D03,0x1703,0x0D53,0x1753,
+  0x0764,0x1164,0x07B4,0x11B4,0x0804,0x1204,0x0854,0x1254,
+  0x08A4,0x12A4,0x08F4,0x12F4,0x0944,0x1344,0x0994,0x1394,
+  0x09E4,0x13E4,0x0A34,0x1434,0x0A84,0x1484,0x0AD4,0x14D4,
+  0x0AD1,0x1524,0x0B74,0x1574,0x0BC4,0x15C4,0x0C14,0x1614,
+  0x0C64,0x1664,0x0CB4,0x16B4,0x0D04,0x1704,0x0D54,0x1754,
+  0x0765,0x1165,0x07B5,0x11B5,0x1205,0x1255,0x12A5,0x12F5,
+  0x1345,0x1395,0x09E5,0x0A35,0x1435,0x0A31,0x0A85,0x14D5,
+  0x1525,0x0C19,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x1396,0x13E6,0x1436,0x1486,0x14D6,0x1526,0x1576,0x15C6,
+  0x1616,0x1666,0x16B6,0x1706,0x1756,0x1167,0x11B7,0x1207,
+  0x1257,0x12A7,0x12F7,0x1347,0x1397,0x13E7,0x1437,0x1487,
+  0x14D7,0x1527,0x1577,0x15C7,0x1617,0x1667,0x16B7,0x1707,
+  0x1757,0x1168,0x11B8,0x1208,0x1258,0x12A8,0x12F8,0x1348,
+  0x1398,0x13E8,0x1438,0x1488,0x14D8,0x1528,0x1578,0x15C8,
+  0x1618,0x1668,0x16B8,0x1708,0x1758,0x1169,0x11B9,0x1209,
+  0x1259,0x12A9,0x12F9,0x1349,0x1399,0x13E9,0x1439,0x1489,
+  0x14D9,0x1529,0x1579,0x15C9,0x1619,0x1669,0x16B9,0x1709,
+  0x1759,0x116A,0x11BA,0x120A,0x125A,0x12AA,0x12FA,0x134A,
+  0x139A,0x13EA,0x143A,0x148A,0x14DA,0x152A,0x157A,0x15CA,
+  0x161A,0x166A,0x16BA,0x170A,0x175A,0x116B,0x11BB,0x120B,
+  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,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,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,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,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,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,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x01F7,0x0000,
+  0x01F8,0x01F9,0x01FA,0x0000,0x0253,0x0000,0x0254,0x0255,
+  0x01D9,0x01FC,0x0257,0x01FE,0x01FF,0x0200,0x0201,0x0202,
+  0x0258,0x0204,0x02A7,0x0206,0x0207,0x0208,0x0209,0x020A,
+  0x0299,0x0248,0x0000,0x02A9,0x024B,0x024C,0x0298,0x024E,
+  0x024F,0x0250,0x0251,0x0252,0x0217,0x0218,0x0219,0x021A,
+  0x021B,0x021C,0x021D,0x021E,0x021F,0x0220,0x0221,0x0222,
+  0x0223,0x0224,0x0225,0x0226,0x0227,0x0228,0x0229,0x022A,
+  0x0267,0x0268,0x0269,0x026A,0x026B,0x026C,0x026D,0x026E,
+  0x026F,0x0270,0x0271,0x0272,0x0273,0x0274,0x0275,0x0000,
+  0x0277,0x0278,0x0259,0x025A,0x0297,0x02B8,0x02B9,0x02BA,
+  0x0000,0x02BB,0x029C,0x02BC,0x029D,0x02BD,0x029E,0x02BE,
+  0x029F,0x02BF,0x02A0,0x02C0,0x02A1,0x02C1,0x02A2,0x02C2,
+  0x02A3,0x02C3,0x02A4,0x02C4,0x02A5,0x02C5,0x02A6,0x02C6,
+  0x02C7,0x02C8,0x02C9,0x02CA,0x0000,0x0307,0x0308,0x0000,
+  0x0309,0x0000,0x0000,0x030A,0x030B,0x02EC,0x02ED,0x02EE,
+  0x0AF1,0x0B41,0x0B91,0x0BE1,0x0C31,0x0C81,0x0CD1,0x0D21,
+  0x0732,0x0782,0x07D2,0x0822,0x0872,0x08C2,0x0912,0x0962,
+  0x0730,0x0780,0x07D0,0x0820,0x0870,0x08C0,0x0910,0x0960,
+  0x09B0,0x0A00,0x0A50,0x0AA0,0x0AF0,0x0B40,0x0B90,0x0BE0,
+  0x0C30,0x0C80,0x0CD0,0x0D20,0x0731,0x0781,0x07D1,0x0821,
+  0x0871,0x08C1,0x0911,0x0961,0x09B1,0x0A01,0x0A51,0x0AA1,
+  0x1130,0x1180,0x11D0,0x1220,0x1270,0x12C0,0x1310,0x1360,
+  0x13B0,0x1400,0x1450,0x14A0,0x14F0,0x1540,0x1590,0x15E0,
+  0x1630,0x1680,0x16D0,0x1720,0x1131,0x1181,0x11D1,0x1221,
+  0x1271,0x12C1,0x1311,0x1361,0x13B1,0x1401,0x1451,0x14A1,
+  0x14F1,0x1541,0x1591,0x15E1,0x1631,0x1681,0x16D1,0x1721,
+  0x1132,0x1182,0x11D2,0x1222,0x1272,0x12C2,0x1312,0x1362,
+  0x09B2,0x13B2,0x0A02,0x1402,0x0A52,0x1452,0x0AA2,0x14A2,
+  0x0AF2,0x14F2,0x0B42,0x1542,0x0B92,0x1592,0x0BE2,0x15E2,
+  0x0C32,0x1632,0x0C82,0x1682,0x0CD2,0x16D2,0x0D22,0x1722,
+  0x0733,0x1133,0x0783,0x1183,0x07D3,0x11D3,0x0823,0x1223,
+  0x0873,0x1273,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x0913,0x1313,0x0963,0x1363,0x09B3,0x13B3,
+  0x0A03,0x1403,0x0A53,0x1453,0x0AA3,0x14A3,0x0AF3,0x14F3,
+  0x0B43,0x1543,0x0B93,0x1593,0x0BE3,0x15E3,0x0C33,0x1633,
+  0x0C83,0x1683,0x0CD3,0x16D3,0x0D23,0x1723,0x0734,0x1134,
+  0x0784,0x1184,0x07D4,0x11D4,0x0824,0x1224,0x0874,0x1274,
+  0x08C4,0x12C4,0x0914,0x1314,0x0964,0x1364,0x09B4,0x13B4,
+  0x0A04,0x1404,0x0A54,0x1454,0x0AA4,0x14A4,0x0AF4,0x14F4,
+  0x0B44,0x0B94,0x1594,0x0BE4,0x15E4,0x0C34,0x1634,0x0C84,
+  0x1684,0x0CD4,0x16D4,0x0D24,0x1724,0x0735,0x1135,0x0000,
+  0x07D5,0x11D5,0x0825,0x1225,0x0875,0x1275,0x08C5,0x12C5,
+  0x0915,0x1315,0x0965,0x1365,0x09B5,0x13B5,0x0A05,0x1405,
+  0x0A55,0x1455,0x0AA5,0x14A5,0x0AF5,0x14F5,0x0B45,0x1545,
+  0x0B95,0x1595,0x0BE5,0x15E5,0x0C35,0x1635,0x0C85,0x1685,
+  0x0CD5,0x16D5,0x0D25,0x1725,0x0736,0x1136,0x0786,0x1186,
+  0x07D6,0x11D6,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0A06,0x1406,0x0A56,0x1456,0x0AA6,0x14A6,0x0AF6,0x14F6,
+  0x0B46,0x1546,0x0B96,0x1596,0x0BE6,0x15E6,0x0C36,0x1636,
+  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,0x0787,0x07D7,0x0827,0x0877,0x08C7,0x0917,0x0967,
+  0x09B7,0x0A07,0x0A57,0x0AA7,0x0AF7,0x0B47,0x0B97,0x0BE7,
+  0x0C37,0x0C87,0x0CD7,0x0D27,0x0738,0x0788,0x07D8,0x0828,
+  0x0878,0x08C8,0x0918,0x0968,0x09B8,0x0A08,0x0A58,0x0AA8,
+  0x0AF8,0x0B48,0x0B98,0x0BE8,0x0C38,0x0C88,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0000,0x1187,0x11D7,0x1227,0x1277,0x12C7,0x1317,0x1367,
+  0x13B7,0x1407,0x1457,0x14A7,0x14F7,0x1547,0x1597,0x15E7,
+  0x1637,0x1687,0x16D7,0x1727,0x1138,0x1188,0x11D8,0x1228,
+  0x1278,0x12C8,0x1318,0x1368,0x13B8,0x1408,0x1458,0x14A8,
+  0x14F8,0x1548,0x1598,0x15E8,0x1638,0x1688,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,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,
+  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,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
+};
+
+
+/* 1E00-1FFF */
+static uint16 uni_1E00_1FFF[512]=
+{
+  0x076C,0x116C,0x07BC,0x11BC,0x080C,0x120C,0x085C,0x125C,
+  0x08AC,0x12AC,0x08FC,0x12FC,0x094C,0x134C,0x099C,0x139C,
+  0x09EC,0x13EC,0x0A3C,0x143C,0x0A8C,0x148C,0x0ADC,0x14DC,
+  0x0B2C,0x152C,0x0B7C,0x157C,0x0BCC,0x15CC,0x0C1C,0x161C,
+  0x0C6C,0x166C,0x0CBC,0x16BC,0x0D0C,0x170C,0x0D5C,0x175C,
+  0x076D,0x116D,0x07BD,0x11BD,0x080D,0x120D,0x085D,0x125D,
+  0x08AD,0x12AD,0x08FD,0x12FD,0x094D,0x134D,0x099D,0x139D,
+  0x09ED,0x13ED,0x0A3D,0x143D,0x0A8D,0x148D,0x0ADD,0x14DD,
+  0x0B2D,0x152D,0x0B7D,0x157D,0x0BCD,0x15CD,0x0C1D,0x161D,
+  0x0C6D,0x166D,0x0CBD,0x16BD,0x0D0D,0x170D,0x0D5D,0x175D,
+  0x076E,0x116E,0x07BE,0x11BE,0x080E,0x120E,0x085E,0x125E,
+  0x08AE,0x12AE,0x08FE,0x12FE,0x094E,0x134E,0x099E,0x139E,
+  0x0770,0x13EE,0x0A3E,0x143E,0x0A8E,0x148E,0x0ADE,0x14DE,
+  0x0B2E,0x152E,0x0B7E,0x157E,0x0BCE,0x15CE,0x0C1E,0x161E,
+  0x0C6E,0x166E,0x0CBE,0x16BE,0x0D0E,0x170E,0x0D5E,0x175E,
+  0x076F,0x116F,0x07BF,0x11BF,0x080F,0x120F,0x085F,0x125F,
+  0x08AF,0x12AF,0x08FF,0x12FF,0x094F,0x134F,0x099F,0x139F,
+  0x09EF,0x13EF,0x0A3F,0x143F,0x0A8F,0x148F,0x0ADF,0x14DF,
+  0x0B2F,0x152F,0x0B7F,0x157F,0x0BCF,0x15CF,0x161F,0x166F,
+  0x16BF,0x170F,0x175F,0x1170,0x0000,0x0000,0x0000,0x0000,
+  0x0900,0x1300,0x0950,0x1350,0x09A0,0x13A0,0x09F0,0x13F0,
+  0x0A40,0x1440,0x0A90,0x1490,0x0AE0,0x14E0,0x0B30,0x1530,
+  0x0B80,0x1580,0x0BD0,0x15D0,0x0C20,0x1620,0x0C70,0x1670,
+  0x0CC0,0x16C0,0x0D10,0x1710,0x0D60,0x1760,0x0771,0x1171,
+  0x07C1,0x11C1,0x0811,0x1211,0x0861,0x1261,0x08B1,0x12B1,
+  0x0901,0x1301,0x0951,0x1351,0x09A1,0x13A1,0x09F1,0x13F1,
+  0x0A41,0x1441,0x0A91,0x1491,0x0AE1,0x14E1,0x0B31,0x1531,
+  0x0B81,0x1581,0x0BD1,0x15D1,0x0C21,0x1621,0x0C71,0x1671,
+  0x0CC1,0x16C1,0x0D11,0x1711,0x0D61,0x1761,0x0772,0x1172,
+  0x07C2,0x11C2,0x0812,0x1212,0x0862,0x1262,0x08B2,0x12B2,
+  0x0902,0x1302,0x0952,0x1352,0x09A2,0x13A2,0x09F2,0x13F2,
+  0x0A42,0x1442,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x1173,0x11C3,0x1213,0x1263,0x12B3,0x1303,0x1353,0x13A3,
+  0x0773,0x07C3,0x0813,0x0863,0x08B3,0x0903,0x0953,0x09A3,
+  0x13F3,0x1443,0x1493,0x14E3,0x1533,0x1583,0x0000,0x0000,
+  0x09F3,0x0A43,0x0A93,0x0AE3,0x0B33,0x0B83,0x0000,0x0000,
+  0x1713,0x1763,0x1174,0x11C4,0x1214,0x1264,0x12B4,0x1304,
+  0x0D13,0x0D63,0x0774,0x07C4,0x0814,0x0864,0x08B4,0x0904,
+  0x1354,0x13A4,0x13F4,0x1444,0x1494,0x14E4,0x1534,0x1584,
+  0x0954,0x09A4,0x09F4,0x0A44,0x0A94,0x0AE4,0x0B34,0x0B84,
+  0x15D4,0x1624,0x1674,0x16C4,0x1714,0x1764,0x0000,0x0000,
+  0x0BD4,0x0C24,0x0C74,0x0CC4,0x0D14,0x0D64,0x0000,0x0000,
+  0x12B5,0x1305,0x1355,0x13A5,0x13F5,0x1445,0x1495,0x14E5,
+  0x0000,0x0905,0x0000,0x09A5,0x0000,0x0A45,0x0000,0x0AE5,
+  0x1675,0x16C5,0x1715,0x1765,0x1176,0x11C6,0x1216,0x1266,
+  0x0C75,0x0CC5,0x0D15,0x0D65,0x0776,0x07C6,0x0816,0x0866,
+  0x12B6,0x1306,0x1356,0x13A6,0x13F6,0x1446,0x1496,0x14E6,
+  0x1536,0x1586,0x15D6,0x1626,0x1676,0x16C6,0x0000,0x0000,
+  0x1177,0x11C7,0x1217,0x1267,0x12B7,0x1307,0x1357,0x13A7,
+  0x0777,0x07C7,0x0817,0x0867,0x08B7,0x0907,0x0957,0x09A7,
+  0x13F7,0x1447,0x1497,0x14E7,0x1537,0x1587,0x15D7,0x1627,
+  0x09F7,0x0A47,0x0A97,0x0AE7,0x0B37,0x0B87,0x0BD7,0x0C27,
+  0x1677,0x16C7,0x1717,0x1767,0x1178,0x11C8,0x1218,0x1268,
+  0x0C77,0x0CC7,0x0D17,0x0D67,0x0778,0x07C8,0x0818,0x0868,
+  0x12B8,0x1308,0x1358,0x13A8,0x13F8,0x0000,0x1498,0x14E8,
+  0x08B8,0x0908,0x08B6,0x0906,0x09A8,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x1538,0x1588,0x15D8,0x0000,0x1678,0x16C8,
+  0x0956,0x09A6,0x09F6,0x0A46,0x0B88,0x0000,0x0000,0x0000,
+  0x1718,0x1768,0x1179,0x11C9,0x0000,0x0000,0x12B9,0x1309,
+  0x0D18,0x0D68,0x0A96,0x0AE6,0x0000,0x0000,0x0000,0x0000,
+  0x13A9,0x13F9,0x1449,0x1499,0x14E9,0x1539,0x1589,0x15D9,
+  0x09A9,0x09F9,0x0BD6,0x0C26,0x0B39,0x0000,0x0000,0x0000,
+  0x0000,0x0000,0x16C9,0x1719,0x0000,0x0000,0x11CA,0x121A,
+  0x0B36,0x0B86,0x0C76,0x0CC6,0x0D19,0x0000,0x0000,0x0000
+};
+
+
+/* 2160-217F */
+static uint16 uni_2160_217F[32]=
+{
+  0x0739,0x0789,0x07D9,0x0829,0x0879,0x08C9,0x0919,0x0969,
+  0x09B9,0x0A09,0x0A59,0x0AA9,0x0AF9,0x0B49,0x0B99,0x0BE9,
+  0x1139,0x1189,0x11D9,0x1229,0x1279,0x12C9,0x1319,0x1369,
+  0x13B9,0x1409,0x1459,0x14A9,0x14F9,0x1549,0x1599,0x15E9
+};
+
+
+/* 24B0-24EF */
+static uint16 uni_24B0_24EF[64]=
+{
+  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0511,0x0512,
+  0x0513,0x0514,0x0515,0x0516,0x0517,0x0518,0x0519,0x051A,
+  0x051B,0x051C,0x051D,0x051E,0x051F,0x0520,0x0521,0x0522,
+  0x0523,0x0524,0x0525,0x0526,0x0527,0x0528,0x0529,0x052A,
+  0x0531,0x0532,0x0533,0x0534,0x0535,0x0536,0x0537,0x0538,
+  0x0539,0x053A,0x053B,0x053C,0x053D,0x053E,0x053F,0x0540,
+  0x0541,0x0542,0x0543,0x0544,0x0545,0x0546,0x0547,0x0548,
+  0x0549,0x054A,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
+};
+
+
+/* FF20-FF5F */
+static uint16 uni_FF20_FF5F[64]=
+{
+  0x0000,0x0560,0x05B0,0x0600,0x0650,0x06A0,0x06F0,0x0740,
+  0x0790,0x07E0,0x0830,0x0880,0x08D0,0x0920,0x0970,0x09C0,
+  0x0A10,0x0A60,0x0AB0,0x0B00,0x0B50,0x0BA0,0x0BF0,0x0C40,
+  0x0C90,0x0CE0,0x0D30,0x0000,0x0000,0x0000,0x0000,0x0000,
+  0x0000,0x0F60,0x0FB0,0x1000,0x1050,0x10A0,0x10F0,0x1140,
+  0x1190,0x11E0,0x1230,0x1280,0x12D0,0x1320,0x1370,0x13C0,
+  0x1410,0x1460,0x14B0,0x1500,0x1550,0x15A0,0x15F0,0x1640,
+  0x1690,0x16E0,0x1730,0x0000,0x0000,0x0000,0x0000,0x0000
+};
+
+
+
+
+
+/*
+  Returns
+   a number 0..15, if a valid HEX digit in lower case,
+   -1 otherwise.
+*/
+
+static int hexlo(int x)
+{
+  static char hex_lo_digit[256]=
+  {
+    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* ................ */
+    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* ................ */
+    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /*  !"#$%&'()*+,-./ */
+     0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1, /* 0123456789:;<=>? */
+    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* @ABCDEFGHIJKLMNO */
+    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* PQRSTUVWXYZ[\]^_ */
+    -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* `abcdefghijklmno */
+    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* pqrstuvwxyz{|}~. */
+    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* ................ */
+    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* ................ */
+    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* ................ */
+    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* ................ */
+    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* ................ */
+    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* ................ */
+    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* ................ */
+    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* ................ */
+  };
+  return hex_lo_digit[(unsigned int) x];
+}
+
+
+/*
+  Safe characters:
+   '\0'  NULL
+   A..Z  capital letters,
+   a..z  small letters
+   0..9  digits
+   _     underscore
+*/
+static char filename_safe_char[128]=
+{
+  1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ................ */
+  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ................ */
+  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*  !"#$%&'()*+,-./ */
+  1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, /* 0123456789:;<=>? */
+  0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* @ABCDEFGHIJKLMNO */
+  1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1, /* PQRSTUVWXYZ[\]^_ */
+  0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* `abcdefghijklmno */
+  1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, /* pqrstuvwxyz{|}~. */
+};
+
+#define MY_FILENAME_ESCAPE '@'
+
+static int
+my_mb_wc_filename(CHARSET_INFO *cs __attribute__((unused)),
+                  my_wc_t *pwc, const uchar *s, const uchar *e)
+{
+  int byte1, byte2;
+  if (s >= e)
+    return MY_CS_TOOFEW(0);
+
+  if (*s < 128 && filename_safe_char[*s])  
+  {
+    *pwc= *s;
+    return 1;
+  }
+  
+  if (*s != MY_FILENAME_ESCAPE)
+    return MY_CS_ILSEQ;
+  
+  if (s + 3 > e)
+    return MY_CS_TOOFEW(0);
+  
+  byte1= s[1];
+  byte2= s[2];
+  
+  if (byte1 >= 0x30 && byte1 <= 0x7F &&
+      byte2 >= 0x30 && byte2 <= 0x7F)
+  {
+    int code= (byte1 - 0x30) * 80 + byte2 - 0x30;
+    if (code < 5994 && touni[code])
+    {
+      *pwc= touni[code];
+      return 3;
+    }
+  }
+  
+  if (s + 4 > e)
+    return MY_CS_TOOFEW(0);
+
+  if ((byte1= hexlo(byte1)) >= 0 &&
+      (byte2= hexlo(byte2)) >= 0)
+  {
+    int byte3= hexlo(s[3]);
+    int byte4= hexlo(s[4]);
+    if (byte3 >=0 && byte4 >=0)
+    {
+      *pwc= (byte1 << 12) + (byte2 << 8) + (byte3 << 4) + byte4;
+      return 5;
+    }
+  }
+  
+  return MY_CS_ILSEQ;
+}
+
+
+static int
+my_wc_mb_filename(CHARSET_INFO *cs __attribute__((unused)),
+                  my_wc_t wc, unsigned char *s, unsigned char *e)
+{
+  int code;
+  char hex[]= "0123456789abcdef";
+  if (wc < 128 && filename_safe_char[wc])
+  {
+    *s= wc;
+    return 1;
+  }
+  
+  if (s + 3 > e)
+    return MY_CS_TOOSMALL;
+
+  *s++= MY_FILENAME_ESCAPE;
+  if ((wc >= 0x00C0 && wc <= 0x05FF && (code= uni_0C00_05FF[wc - 0x00C0])) ||
+      (wc >= 0x1E00 && wc <= 0x1FFF && (code= uni_1E00_1FFF[wc - 0x1E00])) ||
+      (wc >= 0x2160 && wc <= 0x217F && (code= uni_2160_217F[wc - 0x2160])) ||
+      (wc >= 0x24B0 && wc <= 0x24EF && (code= uni_24B0_24EF[wc - 0x24B0])) ||
+      (wc >= 0xFF20 && wc <= 0xFF5F && (code= uni_FF20_FF5F[wc - 0xFF20])))
+  {
+    *s++= (code / 80) + 0x30;
+    *s++= (code % 80) + 0x30;
+    return 3;
+  }
+
+  /* Non letter */
+  if (s + 5 > e)
+    return MY_CS_TOOSMALL;
+
+  *s++= hex[(wc >> 12) & 15];
+  *s++= hex[(wc >> 8) & 15];
+  *s++= hex[(wc >> 4) & 15];
+  *s++= hex[(wc)      & 15];
+  return 5;
+}
+
+
+static MY_COLLATION_HANDLER my_collation_filename_handler =
+{
+    NULL,               /* init */
+    my_strnncoll_utf8,
+    my_strnncollsp_utf8,
+    my_strnxfrm_utf8,
+    my_strnxfrmlen_utf8,
+    my_like_range_mb,
+    my_wildcmp_utf8,
+    my_strcasecmp_utf8,
+    my_instr_mb,
+    my_hash_sort_utf8,
+    my_propagate_complex
+};
+
+static MY_CHARSET_HANDLER my_charset_filename_handler=
+{
+    NULL,               /* init */
+    my_ismbchar_utf8,
+    my_mbcharlen_utf8,
+    my_numchars_mb,
+    my_charpos_mb,
+    my_well_formed_len_mb,
+    my_lengthsp_8bit,
+    my_numcells_mb,
+    my_mb_wc_filename,
+    my_wc_mb_filename,
+    my_caseup_str_utf8,
+    my_casedn_str_utf8,
+    my_caseup_utf8,
+    my_casedn_utf8,
+    my_snprintf_8bit,
+    my_long10_to_str_8bit,
+    my_longlong10_to_str_8bit,
+    my_fill_8bit,
+    my_strntol_8bit,
+    my_strntoul_8bit,
+    my_strntoll_8bit,
+    my_strntoull_8bit,
+    my_strntod_8bit,
+    my_strtoll10_8bit,
+    my_scan_8bit
+};
+
+
+
+CHARSET_INFO my_charset_filename=
+{
+    33,0,0,             /* number       */
+    MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM|MY_CS_UNICODE,  /* state  */
+    "filename",         /* cs name      */
+    "filename",         /* name         */
+    "",                 /* comment      */
+    NULL,               /* tailoring    */
+    ctype_utf8,         /* ctype        */
+    to_lower_utf8,      /* to_lower     */
+    to_upper_utf8,      /* to_upper     */
+    to_upper_utf8,      /* sort_order   */
+    NULL,               /* contractions */
+    NULL,               /* sort_order_big*/
+    NULL,               /* tab_to_uni   */
+    NULL,               /* tab_from_uni */
+    my_unicase_default, /* caseinfo     */
+    NULL,               /* state_map    */
+    NULL,               /* ident_map    */
+    1,                  /* strxfrm_multiply */
+    1,                  /* caseup_multiply  */
+    1,                  /* casedn_multiply  */
+    1,                  /* mbminlen     */
+    5,                  /* mbmaxlen     */
+    0,                  /* min_sort_char */
+    0xFFFF,             /* max_sort_char */
+    ' ',                /* pad char      */
+    0,                  /* escape_with_backslash_is_dangerous */
+    &my_charset_filename_handler,
+    &my_collation_filename_handler
+};
+
 #ifdef MY_TEST_UTF8
 #include <stdio.h>
 

--- 1.18/sql/parse_file.cc	2005-11-24 00:47:27 +04:00
+++ 1.19/sql/parse_file.cc	2005-12-31 08:54:25 +04:00
@@ -226,8 +226,20 @@
   DBUG_PRINT("enter", ("Dir: %s, file: %s, base 0x%lx",
 		       dir->str, file_name->str, (ulong) base));
 
-  fn_format(path, file_name->str, dir->str, 0, MY_UNPACK_FILENAME);
-  path_end= strlen(path);
+  if (dir)
+  {
+    fn_format(path, file_name->str, dir->str, 0, MY_UNPACK_FILENAME);
+    path_end= strlen(path);
+  }
+  else
+  {
+    /*
+      if not dir is passed, it means file_name is a full path,
+      including dir name, file name itself, and an extension,
+      and with unpack_filename() executed over it.
+    */    
+    path_end= strxnmov(path, FN_REFLEN, file_name->str, NullS) - path;
+  }
 
   // temporary file name
   path[path_end]='~';

--- 1.82/sql/sql_view.cc	2005-12-21 22:24:59 +04:00
+++ 1.83/sql/sql_view.cc	2005-12-31 08:54:44 +04:00
@@ -568,8 +568,8 @@
   String str(buff,(uint32) sizeof(buff), system_charset_info);
   char md5[MD5_BUFF_LENGTH];
   bool can_be_merged;
-  char dir_buff[FN_REFLEN], file_buff[FN_REFLEN];
-  LEX_STRING dir, file;
+  char dir_buff[FN_REFLEN], file_buff[FN_REFLEN], path_buff[FN_REFLEN];
+  LEX_STRING dir, file, path;
   DBUG_ENTER("mysql_register_view");
 
   /* print query */
@@ -584,15 +584,17 @@
   DBUG_PRINT("info", ("View: %s", str.ptr()));
 
   /* print file name */
-  (void) my_snprintf(dir_buff, FN_REFLEN, "%s/%s/",
-		     mysql_data_home, view->db);
-  unpack_filename(dir_buff, dir_buff);
+  dir.length= build_table_filename(dir_buff, sizeof(dir_buff),
+                                   view->db, "", "");
   dir.str= dir_buff;
-  dir.length= strlen(dir_buff);
 
-  file.str= file_buff;
-  file.length= (strxnmov(file_buff, FN_REFLEN-1, view->table_name, reg_ext,
-                         NullS) - file_buff);
+  path.length= build_table_filename(path_buff, sizeof(path_buff),
+                                    view->db, view->table_name, reg_ext);
+  path.str= path_buff;
+
+  file.str= path.str + dir.length;
+  file.length= path.length - dir.length;
+
   /* init timestamp */
   if (!view->timestamp.str)
     view->timestamp.str= view->timestamp_buffer;
@@ -1184,9 +1186,8 @@
   {
     TABLE_SHARE *share;
     bool type= 0;
-    strxnmov(path, FN_REFLEN-1, mysql_data_home, "/", view->db, "/",
-             view->table_name, reg_ext, NullS);
-    (void) unpack_filename(path, path);
+    build_table_filename(path, sizeof(path),
+                         view->db, view->table_name, reg_ext);
     VOID(pthread_mutex_lock(&LOCK_open));
     if (access(path, F_OK) ||
 	(type= (mysql_frm_type(thd, path, &not_used) != FRMTYPE_VIEW)))

--- 1.40/sql/sql_trigger.cc	2005-12-28 06:43:33 +04:00
+++ 1.41/sql/sql_trigger.cc	2005-12-31 08:54:42 +04:00
@@ -305,9 +305,9 @@
 {
   LEX *lex= thd->lex;
   TABLE *table= tables->table;
-  char dir_buff[FN_REFLEN], file_buff[FN_REFLEN], trigname_buff[FN_REFLEN],
+  char file_buff[FN_REFLEN], trigname_buff[FN_REFLEN],
        trigname_path[FN_REFLEN];
-  LEX_STRING dir, file, trigname_file;
+  LEX_STRING file, trigname_file;
   LEX_STRING *trg_def, *name;
   ulonglong *trg_sql_mode;
   char trg_definer_holder[HOSTNAME_LENGTH + USERNAME_LENGTH + 2];
@@ -386,20 +386,18 @@
     sql_create_definition_file() files handles renaming and backup of older
     versions
   */
-  strxnmov(dir_buff, FN_REFLEN-1, mysql_data_home, "/", tables->db, "/", NullS);
-  dir.length= unpack_filename(dir_buff, dir_buff);
-  dir.str= dir_buff;
-  file.length=  strxnmov(file_buff, FN_REFLEN-1, tables->table_name,
-                         triggers_file_ext, NullS) - file_buff;
+  file.length= build_table_filename(file_buff, FN_REFLEN-1,
+                                    tables->db, tables->table_name,
+                                    triggers_file_ext);
   file.str= file_buff;
-  trigname_file.length= strxnmov(trigname_buff, FN_REFLEN-1,
-                                 lex->spname->m_name.str,
-                                 trigname_file_ext, NullS) - trigname_buff;
+  trigname_file.length= build_table_filename(trigname_buff, FN_REFLEN-1,
+                                             tables->db,
+                                             lex->spname->m_name.str,
+                                             trigname_file_ext);
   trigname_file.str= trigname_buff;
-  strxnmov(trigname_path, FN_REFLEN-1, dir_buff, trigname_buff, NullS);
 
   /* Use the filesystem to enforce trigger namespace constraints. */
-  if (!access(trigname_path, F_OK))
+  if (!access(trigname_buff, F_OK))
   {
     my_error(ER_TRG_ALREADY_EXISTS, MYF(0));
     return 1;
@@ -408,7 +406,7 @@
   trigname.trigger_table.str= tables->table_name;
   trigname.trigger_table.length= tables->table_name_length;
 
-  if (sql_create_definition_file(&dir, &trigname_file, &trigname_file_type,
+  if (sql_create_definition_file(NULL, &trigname_file, &trigname_file_type,
                                  (gptr)&trigname, trigname_file_parameters, 0))
     return 1;
 
@@ -455,7 +453,7 @@
   trg_definer->length= strxmov(trg_definer->str, definer_user->str, "@",
                                definer_host->str, NullS) - trg_definer->str;
 
-  if (!sql_create_definition_file(&dir, &file, &triggers_file_type,
+  if (!sql_create_definition_file(NULL, &file, &triggers_file_type,
                                   (gptr)this, triggers_file_parameters,
                                   TRG_MAX_VERSIONS))
     return 0;
@@ -483,9 +481,7 @@
 
 static bool rm_trigger_file(char *path, char *db, char *table_name)
 {
-  strxnmov(path, FN_REFLEN-1, mysql_data_home, "/", db, "/", table_name,
-           triggers_file_ext, NullS);
-  unpack_filename(path, path);
+  build_table_filename(path, FN_REFLEN-1, db, table_name, triggers_file_ext);
   return my_delete(path, MYF(MY_WME));
 }
 
@@ -507,9 +503,7 @@
 
 static bool rm_trigname_file(char *path, char *db, char *trigger_name)
 {
-  strxnmov(path, FN_REFLEN-1, mysql_data_home, "/", db, "/", trigger_name,
-           trigname_file_ext, NullS);
-  unpack_filename(path, path);
+  build_table_filename(path, FN_REFLEN-1, db, trigger_name, trigname_file_ext);
   return my_delete(path, MYF(MY_WME));
 }
 
@@ -567,18 +561,14 @@
       }
       else
       {
-        char dir_buff[FN_REFLEN], file_buff[FN_REFLEN];
-        LEX_STRING dir, file;
+        char file_buff[FN_REFLEN];
+        LEX_STRING file;
 
-        strxnmov(dir_buff, FN_REFLEN-1, mysql_data_home, "/", tables->db,
-                 "/", NullS);
-        dir.length= unpack_filename(dir_buff, dir_buff);
-        dir.str= dir_buff;
-        file.length=  strxnmov(file_buff, FN_REFLEN-1, tables->table_name,
-                               triggers_file_ext, NullS) - file_buff;
+        file.length= build_table_filename(file_buff, FN_REFLEN-1,
+                                          tables->db, tables->table_name,
+                                          triggers_file_ext);
         file.str= file_buff;
-
-        if (sql_create_definition_file(&dir, &file, &triggers_file_type,
+        if (sql_create_definition_file(NULL, &file, &triggers_file_type,
                                        (gptr)this, triggers_file_parameters,
                                        TRG_MAX_VERSIONS))
           return 1;
@@ -692,9 +682,8 @@
 
   DBUG_ENTER("Table_triggers_list::check_n_load");
 
-  strxnmov(path_buff, FN_REFLEN-1, mysql_data_home, "/", db, "/", table_name,
-           triggers_file_ext, NullS);
-  path.length= unpack_filename(path_buff, path_buff);
+  path.length= build_table_filename(path_buff, FN_REFLEN-1,
+                                    db, table_name, triggers_file_ext);
   path.str= path_buff;
 
   // QQ: should we analyze errno somehow ?
@@ -1026,9 +1015,9 @@
   struct st_trigname trigname;
   DBUG_ENTER("add_table_for_trigger");
 
-  strxnmov(path_buff, FN_REFLEN-1, mysql_data_home, "/", trig->m_db.str, "/",
-           trig->m_name.str, trigname_file_ext, NullS);
-  path.length= unpack_filename(path_buff, path_buff);
+  path.length= build_table_filename(path_buff, FN_REFLEN-1,
+                                    trig->m_db.str, trig->m_name.str,
+                                    trigname_file_ext);
   path.str= path_buff;
 
   if (access(path_buff, F_OK))

--- 1.3/sql/discover.cc	2004-09-13 17:46:36 +05:00
+++ 1.4/sql/discover.cc	2005-12-31 08:53:07 +04:00
@@ -55,7 +55,8 @@
   *frmdata= NULL;      // In case of errors
   *len= 0;
   error= 1;
-  if ((file=my_open(fn_format(index_file,name,"",reg_ext,4),
+  if ((file=my_open(fn_format(index_file,name,"",reg_ext,
+                              MY_UNPACK_FILENAME|MY_APPEND_EXT),
 		    O_RDONLY | O_SHARE,
 		    MYF(0))) < 0)  
     goto err_end; 
@@ -112,7 +113,8 @@
   //DBUG_DUMP("frmdata", (char*)frmdata, len);
 
   error= 0;
-  if ((file=my_create(fn_format(index_file,name,"",reg_ext,4),
+  if ((file=my_create(fn_format(index_file,name,"",reg_ext,
+                      MY_UNPACK_FILENAME|MY_APPEND_EXT),
 		      CREATE_MODE,O_RDWR | O_TRUNC,MYF(MY_WME))) >= 0)
   {
     if (my_write(file,(byte*)frmdata,len,MYF(MY_WME | MY_NABP)))

--- 1.227/sql/ha_ndbcluster.cc	2005-12-26 15:53:39 +04:00
+++ 1.228/sql/ha_ndbcluster.cc	2005-12-31 08:53:52 +04:00
@@ -3961,7 +3961,8 @@
   DBUG_ENTER("ha_ndbcluster::create");
   DBUG_PRINT("enter", ("name: %s", name));
 
-  fn_format(name2, name, "", "",2);       // Remove the .frm extension
+  strcpy(name2, name);
+  DBUG_ASSERT(*fn_rext((char*)name2) == 0);
   set_dbname(name2);
   set_tabname(name2);    
 

--- 1.117/storage/innobase/row/row0mysql.c	2005-12-22 08:10:54 +04:00
+++ 1.118/storage/innobase/row/row0mysql.c	2005-12-31 08:55:25 +04:00
@@ -3484,7 +3484,8 @@
 	const char*	name)	/* in: table name in the form
 				'database/tablename' */
 {
-	return(strstr(name, "/#sql") != NULL);
+	//return(strstr(name, "/#sql") != NULL);
+	return(strstr(name, "/@0023sql") != NULL);
 }
 
 /*************************************************************************

--- 1.57/mysql-test/r/alter_table.result	2005-12-01 01:41:36 +04:00
+++ 1.58/mysql-test/r/alter_table.result	2005-12-31 08:51:12 +04:00
@@ -373,10 +373,10 @@
 t1	1	Host	1	Host	A	NULL	NULL	NULL		BTREE	disabled
 DROP TABLE t1;
 create table t1 (a int);
-alter table t1 rename to `t1\\`;
-ERROR 42000: Incorrect table name 't1\\'
-rename table t1 to `t1\\`;
-ERROR 42000: Incorrect table name 't1\\'
+alter table t1 rename to ``;
+ERROR 42000: Incorrect table name ''
+rename table t1 to ``;
+ERROR 42000: Incorrect table name ''
 drop table t1;
 drop table if exists t1, t2;
 Warnings:

--- 1.110/mysql-test/r/create.result	2005-12-26 13:50:35 +04:00
+++ 1.111/mysql-test/r/create.result	2005-12-31 08:51:16 +04:00
@@ -41,7 +41,14 @@
 create table not_existing_database.test (a int);
 ERROR 42000: Unknown database 'not_existing_database'
 create table `a/a` (a int);
-ERROR 42000: Incorrect table name 'a/a'
+show create table `a/a`;
+Table	Create Table
+a/a	CREATE TABLE `a/a` (
+  `a` int(11) default NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1
+create table t1 like `a/a`;
+drop table `a/a`;
+drop table `t1`;
 create table `aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa` (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa int);
 ERROR 42000: Incorrect table name 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
 create table a (`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa` int);
@@ -360,8 +367,6 @@
 ERROR 42S02: Unknown table 'non_existing_table'
 create temporary table t3 like t1;
 ERROR 42S01: Table 't3' already exists
-create table t3 like `a/a`;
-ERROR 42000: Incorrect table name 'a/a'
 drop table t1, t2, t3;
 drop table t3;
 drop database mysqltest;

--- 1.86/mysql-test/r/show_check.result	2005-12-09 15:39:38 +04:00
+++ 1.87/mysql-test/r/show_check.result	2005-12-31 08:51:24 +04:00
@@ -274,8 +274,42 @@
 drop table t1;
 SET @old_sql_mode= @@sql_mode, sql_mode= '';
 SET @old_sql_quote_show_create= @@sql_quote_show_create, sql_quote_show_create= OFF;
-CREATE TABLE `a/b` (i INT);
-ERROR 42000: Incorrect table name 'a/b'
+CREATE TABLE ```ab``cd``` (i INT);
+SHOW CREATE TABLE ```ab``cd```;
+Table	Create Table
+`ab`cd`	CREATE TABLE ```ab``cd``` (
+  i int(11) default NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1
+DROP TABLE ```ab``cd```;
+CREATE TABLE ```ab````cd``` (i INT);
+SHOW CREATE TABLE ```ab````cd```;
+Table	Create Table
+`ab``cd`	CREATE TABLE ```ab````cd``` (
+  i int(11) default NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1
+DROP TABLE ```ab````cd```;
+CREATE TABLE ```a` (i INT);
+SHOW CREATE TABLE ```a`;
+Table	Create Table
+`a	CREATE TABLE ```a` (
+  i int(11) default NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1
+DROP TABLE ```a`;
+CREATE TABLE `a.1` (i INT);
+SHOW CREATE TABLE `a.1`;
+Table	Create Table
+a.1	CREATE TABLE `a.1` (
+  i int(11) default NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1
+DROP TABLE `a.1`;
+SET sql_mode= 'ANSI_QUOTES';
+CREATE TABLE """a" (i INT);
+SHOW CREATE TABLE """a";
+Table	Create Table
+"a	CREATE TABLE """a" (
+  i int(11) default NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1
+DROP TABLE """a";
 SET sql_mode= '';
 SET sql_quote_show_create= OFF;
 CREATE TABLE t1 (i INT);

--- 1.44/mysql-test/t/alter_table.test	2005-12-05 21:59:57 +04:00
+++ 1.45/mysql-test/t/alter_table.test	2005-12-31 08:49:41 +04:00
@@ -232,9 +232,9 @@
 #
 create table t1 (a int);
 --error 1103
-alter table t1 rename to `t1\\`;
+alter table t1 rename to ``;
 --error 1103
-rename table t1 to `t1\\`;
+rename table t1 to ``;
 drop table t1;
 
 #

--- 1.72/mysql-test/t/create.test	2005-12-26 13:48:53 +04:00
+++ 1.73/mysql-test/t/create.test	2005-12-31 08:49:49 +04:00
@@ -41,8 +41,11 @@
 
 -- error 1049
 create table not_existing_database.test (a int);
---error 1103
 create table `a/a` (a int);
+show create table `a/a`;
+create table t1 like `a/a`;
+drop table `a/a`;
+drop table `t1`;
 --error 1103
 create table `aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa` (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa int);
 --error 1059
@@ -304,8 +307,6 @@
 create table t3 like non_existing_table;
 --error 1050
 create temporary table t3 like t1;
---error 1103
-create table t3 like `a/a`;
 drop table t1, t2, t3;
 drop table t3;
 drop database mysqltest;

--- 1.59/mysql-test/t/show_check.test	2005-12-09 15:39:39 +04:00
+++ 1.60/mysql-test/t/show_check.test	2005-12-31 08:49:53 +04:00
@@ -162,33 +162,28 @@
 SET @old_sql_mode= @@sql_mode, sql_mode= '';
 SET @old_sql_quote_show_create= @@sql_quote_show_create, sql_quote_show_create= OFF;
 
-######### hook for WL#1324 #
---error 1103
-CREATE TABLE `a/b` (i INT);
-# the above test should WORK when WL#1324 is done,
-# it should be removed and
-# the following part should be uncommented then
-#########################################################
-# begin of part that must be uncommented when WL#1324 is done
-#########################################################
-#CREATE TABLE ```ab``cd``` (i INT);
-#SHOW CREATE TABLE ```ab``cd```;
-#DROP TABLE ```ab``cd```;
-
-#CREATE TABLE ```ab````cd``` (i INT);
-#SHOW CREATE TABLE ```ab````cd```;
-#DROP TABLE ```ab````cd```;
-#
-#CREATE TABLE ```a` (i INT);
-#SHOW CREATE TABLE ```a`;
-#DROP TABLE ```a`;
-#
-#SET sql_mode= 'ANSI_QUOTES';
-#
-#CREATE TABLE """a" (i INT);
-#SHOW CREATE TABLE """a";
-#DROP TABLE """a";
-#
+CREATE TABLE ```ab``cd``` (i INT);
+SHOW CREATE TABLE ```ab``cd```;
+DROP TABLE ```ab``cd```;
+
+CREATE TABLE ```ab````cd``` (i INT);
+SHOW CREATE TABLE ```ab````cd```;
+DROP TABLE ```ab````cd```;
+
+CREATE TABLE ```a` (i INT);
+SHOW CREATE TABLE ```a`;
+DROP TABLE ```a`;
+
+CREATE TABLE `a.1` (i INT);
+SHOW CREATE TABLE `a.1`;
+DROP TABLE `a.1`;
+
+SET sql_mode= 'ANSI_QUOTES';
+
+CREATE TABLE """a" (i INT);
+SHOW CREATE TABLE """a";
+DROP TABLE """a";
+
 #Bug #4374 SHOW TABLE STATUS FROM ignores collation_connection
 #set names latin1;
@@ -196,9 +191,6 @@
 #--replace_column 7 # 8 # 9 #
-#########################################################
-# end of part that must be uncommented when WL#1324 is done
-#########################################################
 
 # to test quotes around keywords.. :
 

--- 1.246/sql/ha_innodb.cc	2005-12-29 22:11:33 +04:00
+++ 1.247/sql/ha_innodb.cc	2005-12-31 08:53:45 +04:00
@@ -4857,7 +4857,7 @@
 		srv_lower_case_table_names = FALSE;
 	}
 
-	fn_format(name2, name, "", "", 2);	// Remove the .frm extension
+	strcpy(name2, name);
 
 	normalize_table_name(norm_name, name2);
 

--- 1.33/sql/sql_rename.cc	2005-12-22 08:10:57 +04:00
+++ 1.34/sql/sql_rename.cc	2005-12-31 08:54:36 +04:00
@@ -155,18 +155,15 @@
       old_alias= ren_table->table_name;
       new_alias= new_table->table_name;
     }
-    sprintf(name,"%s/%s/%s%s",mysql_data_home,
-	    new_table->db, new_alias, reg_ext);
-    unpack_filename(name, name);
+    build_table_filename(name, sizeof(name),
+                         new_table->db, new_alias, reg_ext);
     if (!access(name,F_OK))
     {
       my_error(ER_TABLE_EXISTS_ERROR, MYF(0), new_alias);
       DBUG_RETURN(ren_table);			// This can't be skipped
     }
-    sprintf(name,"%s/%s/%s%s",mysql_data_home,
-	    ren_table->db, old_alias,
-	    reg_ext);
-    unpack_filename(name, name);
+    build_table_filename(name, sizeof(name),
+                         ren_table->db, old_alias, reg_ext);
 
     frm_type= mysql_frm_type(thd, name, &table_type);
     switch (frm_type)

--- 1.9/sql/strfunc.cc	2005-02-25 18:53:16 +04:00
+++ 1.10/sql/strfunc.cc	2005-12-31 08:54:46 +04:00
@@ -235,3 +235,79 @@
     *end_of_word= ptr;
   return res;
 }
+
+
+/*
+  Converts a string between character sets
+
+  SYNOPSIS
+    strconvert()
+    from_cs       source character set
+    from          source, a null terminated string
+    to            destination buffer
+    to_length     destination buffer length
+
+  NOTES
+    'to' is always terminated with a '\0' character.
+    If there is no enough space to convert whole string,
+    only prefix is converted, and terminated with '\0'.
+
+  RETURN VALUES
+    result string length
+*/
+
+
+uint strconvert(CHARSET_INFO *from_cs, const char *from,
+                CHARSET_INFO *to_cs, char *to, uint to_length)
+{
+  int cnvres;
+  my_wc_t wc;
+  char *to_start= to;
+  uchar *to_end= (uchar*) to + to_length - 1;
+  int (*mb_wc)(struct charset_info_st *, my_wc_t *, const uchar *,
+	       const uchar *)= from_cs->cset->mb_wc;
+  int (*wc_mb)(struct charset_info_st *, my_wc_t, uchar *s, uchar *e)=
+    to_cs->cset->wc_mb;
+  uint error_count= 0;
+
+  while (1)
+  {
+    /*
+      Using 'from + 10' is safe:
+      - it is enough to scan a single character in any character set.
+      - if remaining string is shorter than 10, then mb_wc will return
+        with error because of unexpected '\0' character.
+    */
+    if ((cnvres= (*mb_wc)(from_cs, &wc,
+                          (uchar*) from, (uchar*) from + 10)) > 0)
+    {
+      if (!wc)
+        break;
+      from+= cnvres;
+    }
+    else if (cnvres == MY_CS_ILSEQ)
+    {
+      error_count++;
+      from++;
+      wc= '?';
+    }
+    else
+      break; // Impossible char.
+
+outp:
+
+    if ((cnvres= (*wc_mb)(to_cs, wc, (uchar*) to, to_end)) > 0)
+      to+= cnvres;
+    else if (cnvres == MY_CS_ILUNI && wc != '?')
+    {
+      error_count++;
+      wc= '?';
+      goto outp;
+    }
+    else
+      break;
+  }
+  *to= '\0';
+  return (uint32) (to - to_start);
+
+}

--- 1.17/sql/ha_partition.cc	2005-12-26 15:53:40 +04:00
+++ 1.18/sql/ha_partition.cc	2005-12-31 08:53:54 +04:00
@@ -399,7 +399,8 @@
   DBUG_ENTER("ha_partition::create");
 
   strmov(t_name, name);
-  *fn_ext(t_name)= 0;
+//  *fn_ext(t_name)= 0;
+  DBUG_ASSERT(*fn_rext((char*)name) == '\0');
   if (del_ren_cre_table(t_name, NULL, table_arg, create_info))
   {
     handler::delete_table(t_name);
@@ -677,7 +678,7 @@
     Create and write and close file
     to be used at open, delete_table and rename_table
   */
-  fn_format(file_name, name, "", ".par", MYF(MY_REPLACE_EXT));
+  fn_format(file_name, name, "", ".par", MY_APPEND_EXT);
   if ((file= my_create(file_name, CREATE_MODE, O_RDWR | O_TRUNC,
 		       MYF(MY_WME))) >= 0)
   {
@@ -802,7 +803,7 @@
 
   if (m_file_buffer)
     DBUG_RETURN(FALSE);
-  fn_format(buff, name, "", ha_par_ext, MYF(0));
+  fn_format(buff, name, "", ha_par_ext, MY_APPEND_EXT);
 
   /* Following could be done with my_stat to read in whole file */
   if ((file= my_open(buff, O_RDONLY | O_SHARE, MYF(0))) < 0)

--- 1.87/mysql-test/r/mysqldump.result	2005-12-02 15:01:36 +04:00
+++ 1.88/mysql-test/r/mysqldump.result	2005-12-31 08:51:20 +04:00
@@ -1627,7 +1627,7 @@
 test_sequence
 ------ Testing with illegal database names ------
 mysqldump: Got error: 1049: Unknown database 'mysqldump_test_d' when selecting the database
-mysqldump: Got error: 1102: Incorrect database name 'mysqld\ump_test_db' when selecting the database
+mysqldump: Got error: 1049: Unknown database 'mysqld\ump_test_db' when selecting the database
 drop table t1, t2, t3;
 drop database mysqldump_test_db;
 use test;
Thread
bk commit into 5.1 tree (bar:1.2012)bar31 Dec