summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Betts <paul@paulbetts.org>2011-09-19 12:41:27 -0700
committerPaul Betts <paul@paulbetts.org>2011-09-19 13:14:09 -0700
commit6d0ef97478633263cafa1329e865f5a33b950ac3 (patch)
treef41be9d8b7e0b753cbe760d36861bedd94e6595b
parent7998ae5ab1d7a37860e10cdb34b3da1532b6efb0 (diff)
downloadlibgit2-utf8-paths-win32.tar.gz
Fix opendir/readdir and friends on Win32 to use Unicodeutf8-paths-win32
-rw-r--r--src/dir.h2
-rw-r--r--src/win32/dir.c19
2 files changed, 15 insertions, 6 deletions
diff --git a/src/dir.h b/src/dir.h
index ed517da33..5d50692e4 100644
--- a/src/dir.h
+++ b/src/dir.h
@@ -22,7 +22,7 @@ struct git__dirent {
typedef struct {
HANDLE h;
- WIN32_FIND_DATA f;
+ WIN32_FIND_DATAW f;
struct git__dirent entry;
char *dir;
int first;
diff --git a/src/win32/dir.c b/src/win32/dir.c
index 380dc0c13..ab50318e3 100644
--- a/src/win32/dir.c
+++ b/src/win32/dir.c
@@ -26,6 +26,7 @@ static int init_filter(char *filter, size_t n, const char *dir)
git__DIR *git__opendir(const char *dir)
{
char filter[4096];
+ wchar_t* filter_w;
git__DIR *new;
if (!dir || !init_filter(filter, sizeof(filter), dir))
@@ -42,7 +43,10 @@ git__DIR *git__opendir(const char *dir)
}
strcpy(new->dir, dir);
- new->h = FindFirstFile(filter, &new->f);
+ filter_w = conv_utf8_to_utf16(filter);
+ new->h = FindFirstFileW(filter_w, &new->f);
+ free(filter_w);
+
if (new->h == INVALID_HANDLE_VALUE) {
free(new->dir);
free(new);
@@ -61,15 +65,15 @@ struct git__dirent *git__readdir(git__DIR *d)
if (d->first)
d->first = 0;
else {
- if (!FindNextFile(d->h, &d->f))
+ if (!FindNextFileW(d->h, &d->f))
return NULL;
}
- if (strlen(d->f.cFileName) >= sizeof(d->entry.d_name))
+ if (wcslen(d->f.cFileName) >= sizeof(d->entry.d_name))
return NULL;
d->entry.d_ino = 0;
- strcpy(d->entry.d_name, d->f.cFileName);
+ WideCharToMultiByte(CP_UTF8, 0, d->f.cFileName, -1, d->entry.d_name, GIT_PATH_MAX, NULL, NULL);
return &d->entry;
}
@@ -77,14 +81,19 @@ struct git__dirent *git__readdir(git__DIR *d)
void git__rewinddir(git__DIR *d)
{
char filter[4096];
+ wchar_t* filter_w;
if (d) {
if (d->h != INVALID_HANDLE_VALUE)
FindClose(d->h);
d->h = INVALID_HANDLE_VALUE;
d->first = 0;
+
if (init_filter(filter, sizeof(filter), d->dir)) {
- d->h = FindFirstFile(filter, &d->f);
+ filter_w = conv_utf8_to_utf16(filter);
+ d->h = FindFirstFileW(filter_w, &d->f);
+ free(filter_w);
+
if (d->h != INVALID_HANDLE_VALUE)
d->first = 1;
}