[Mew-dist 07668] multibyte character problem (Re: Re: user meeting?)

Kyotaro HORIGUCHI kyota at example.com
1999年 2月 24日 (水) 13:41:24 JST


堀口です. Meadow が 0x5c で終わる文字コードが起こす問題の話です.
 mew-win32 ネタですが, 話の流れ上 mew-dist で続けます.

 問題はとりあえず Meadow 1.00/1.01 では w32.c にありました.

 むちゃくちゃやっつけですが添付のパッチのような修正をすることで 

   ・file-name-all-completions, file-name-completion は(多分^^;)
     期待通りの動作になっていると思います.

   ・ あと, find-file などで c:/temp/表 といったファイル名もちゃ
     んと読みこめるようになっています.

 ただし, ほかにも怪しいところがあるのを放っておいてあるところがあ
るのでこのままおひぃしゃるなりリースに加えることはできないと思い
ます.

At Mon, 22 Feb 1999 16:38:40 +0900, Hideyuki SHIRAI (白井秀行) <shirai at example.com> wrote in <19990222163846A.shirai at example.com>
> Win95 でやってみました。
> 
>   d:/tmp/ZZZ:
>   total 1
>   drwxrwxrwx   1   shirai        0        0 Feb 22 16:25 .
>   drwxrwxrwx   1   shirai        0        0 Jun 25  1997 ..
>   -rw-rw-rw-   1   shirai        0        7 Feb 22 16:28 aaa十bbb
>   -rw-rw-rw-   1   shirai        0        5 Feb 22 16:28 cccソ
> 
> としておいて
...
> ・Meadow 1.01 (20.2 ベース)
> (file-name-all-completions "" "d:/tmp/ZZZ/")
> => ("aaa十bbb" "../" "./") ;; あれれ?
> 
> (file-name-completion "a" "d:/tmp/ZZZ/")
> => "aaa十bbb"
> 
> なぜか "cccソ" が
> (file-name-completion "c" "d:/tmp/ZZZ/")
> => nil

-------------- next part --------------
*** w32.c.org	Wed Feb 24 12:49:58 1999
--- w32.c	Wed Feb 24 13:15:56 1999
***************
*** 518,524 ****
        if (IS_DIRECTORY_SEP (name[0]))
  	name++;
      }
!   else if (IS_DIRECTORY_SEP (name[0]) && IS_DIRECTORY_SEP (name[1]))
      {
        int slashes = 2;
        name += 2;
--- 518,525 ----
        if (IS_DIRECTORY_SEP (name[0]))
  	name++;
      }
!   else if (_mbsnbcnt(name, 1) == 1 && /* top byte is single-byte-character */
! 	   IS_DIRECTORY_SEP (name[0]) && IS_DIRECTORY_SEP (name[1]))
      {
        int slashes = 2;
        name += 2;
***************
*** 1167,1182 ****
        temp[2] = '\\';
        temp[3] = 0;
      }
!   else if (IS_DIRECTORY_SEP (name[0]) && IS_DIRECTORY_SEP (name[1]))
      {
        char *str = temp;
        int slashes = 4;
        rootname = temp;
        do
          {
! 	  if (IS_DIRECTORY_SEP (*name) && --slashes == 0)
  	    break;
! 	  *str++ = *name++;
  	}
        while ( *name );
  
--- 1168,1190 ----
        temp[2] = '\\';
        temp[3] = 0;
      }
!   else if (_mbsnbcnt(name, 1) == 1 && /* top byte is single-byte-character */
! 	   IS_DIRECTORY_SEP (name[0]) && IS_DIRECTORY_SEP (name[1]))
      {
        char *str = temp;
        int slashes = 4;
        rootname = temp;
        do
          {
! 	  if (_mbsnbcnt(name, 1) == 1 && /* *name is single-byte-character*/
! 	      IS_DIRECTORY_SEP (*name) && --slashes == 0)
  	    break;
! 	  *str = *name;
! 	  if(_mbsnbcnt(name, 1) > 1){
! 	    ++str; ++name;
! 	    *str = *name;
! 	  }
! 	  ++str; ++name;
  	}
        while ( *name );
  
***************
*** 1361,1368 ****
        int ln;
  
        strcpy (filename, dir_pathname);
!       ln = strlen (filename) - 1;
!       if (!IS_DIRECTORY_SEP (filename[ln]))
  	strcat (filename, "\\");
        strcat (filename, "*");
  
--- 1369,1377 ----
        int ln;
  
        strcpy (filename, dir_pathname);
!       ln  = strlen(filename) - 1;
!       if (_mbsnbcnt(filename, _mbslen(filename) -1) != ln ||
! 	  !IS_DIRECTORY_SEP (filename[ln]))
  	strcat (filename, "\\");
        strcat (filename, "*");
  
***************
*** 1829,1835 ****
  
    if (rootdir)
      {
!       if (!IS_DIRECTORY_SEP (name[len-1]))
  	strcat (name, "\\");
        if (GetDriveType (name) < 2)
  	{
--- 1838,1845 ----
  
    if (rootdir)
      {
!       if (_mbsnbcnt(name, _mbslen(name) -1) != strlen(name) -1 ||
! 	  !IS_DIRECTORY_SEP (name[len-1]))
  	strcat (name, "\\");
        if (GetDriveType (name) < 2)
  	{
***************
*** 1845,1851 ****
      }
    else
      {
!       if (IS_DIRECTORY_SEP (name[len-1]))
  	name[len - 1] = 0;
  
        /* (This is hacky, but helps when doing file completions on
--- 1855,1862 ----
      }
    else
      {
!       if (_mbsnbcnt(name, _mbslen(name) -1) == strlen(name) -1 &&
! 	  IS_DIRECTORY_SEP (name[len-1]))
  	name[len - 1] = 0;
  
        /* (This is hacky, but helps when doing file completions on


Mew-dist メーリングリストの案内