7
7
#include <stdio.h>
8
8
#include <ctype.h>
9
9
#include <string.h>
10
+ #include <utf.h>
10
11
11
12
#include "win32_dirent.h"
12
13
@@ -18,13 +19,16 @@ DIR * opendir(char *name)
18
19
intptr_t hFile ;
19
20
DIR * pdir ;
20
21
wchar_t searchstr [MAX_PATH ];
21
- wchar_t wname [ MAX_PATH ] ;
22
+ wchar_t * wname = NULL ;
22
23
int needed ;
24
+ char * tmp = NULL ;
23
25
24
- MultiByteToWideChar (CP_UTF8 , 0 , name , -1 , wname , MAX_PATH );
26
+ if ((wname = utf8_to_utf16 (name )) == NULL )
27
+ fatal ("failed to covert input arguments" );
25
28
26
29
// add *.* for Windows _findfirst() search pattern
27
30
swprintf_s (searchstr , MAX_PATH , L"%s\\*.*" , wname );
31
+ free (wname );
28
32
29
33
if ((hFile = _wfindfirst (searchstr , & c_file )) == -1L ) {
30
34
if (1 ) // verbose
@@ -40,11 +44,12 @@ DIR * opendir(char *name)
40
44
pdir -> c_file .time_create = c_file .time_create ;
41
45
pdir -> c_file .time_write = c_file .time_write ;
42
46
43
- if ((needed = WideCharToMultiByte (CP_UTF8 , 0 , c_file .name , -1 , NULL , 0 , NULL , NULL )) == 0 ||
44
- WideCharToMultiByte (CP_UTF8 , 0 , c_file .name , -1 , pdir -> c_file .name , needed , NULL , NULL ) != needed )
47
+ if ((tmp = utf16_to_utf8 (& (c_file .name ))) == NULL )
45
48
fatal ("failed to covert input arguments" );
46
49
50
+ strcpy_s (pdir -> c_file .name , MAX_PATH , tmp );
47
51
strcpy_s (pdir -> initName , sizeof (pdir -> initName ), pdir -> c_file .name );
52
+ free (tmp );
48
53
49
54
return pdir ;
50
55
}
@@ -69,7 +74,6 @@ int closedir(DIR *dirp)
69
74
by a later readdir call on the same DIR stream. */
70
75
struct dirent * readdir (void * avp )
71
76
{
72
- int needed ;
73
77
struct dirent * pdirentry ;
74
78
struct _wfinddata_t c_file ;
75
79
DIR * dirp = (DIR * )avp ;
@@ -83,10 +87,9 @@ struct dirent *readdir(void *avp)
83
87
}
84
88
pdirentry = (struct dirent * ) malloc ( sizeof (struct dirent ) );
85
89
86
- if ((tmp = utf16_to_utf8 (pdirentry -> d_name )) == NULL )
90
+ if ((tmp = utf16_to_utf8 (& ( c_file . name ) )) == NULL )
87
91
fatal ("failed to covert input arguments" );
88
- strcpy (c_file .name [0 ], tmp );
89
- free (tmp );
92
+ pdirentry -> d_name = tmp ;
90
93
tmp = NULL ;
91
94
92
95
pdirentry -> d_ino = 1 ; // a fictious one like UNIX to say it is nonzero
0 commit comments