win32: fix Get_current_directory() for unicode directories
it was returning things like C:\TEMP\grafx2\test-à__??????\ instead of the ASCII short path : C:\TEMP\grafx2\TEST-_~1\ see http://pulkomandy.tk/projects/GrafX2/ticket/45
This commit is contained in:
parent
d4aa63964d
commit
cb78ac6136
76
src/io.c
76
src/io.c
@ -973,33 +973,68 @@ char * Get_current_directory(char * buf, word * * unicode, size_t size)
|
|||||||
|
|
||||||
return buf;
|
return buf;
|
||||||
#elif defined(WIN32)
|
#elif defined(WIN32)
|
||||||
|
WCHAR * long_dir, * short_dir;
|
||||||
|
size_t size_long, size_short;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
// first get the current directory in unicode
|
||||||
|
size_long = (size_t)GetCurrentDirectoryW(0, NULL);
|
||||||
|
if (size_long == 0)
|
||||||
|
{
|
||||||
|
GFX2_Log(GFX2_ERROR, "GetCurrentDirectoryW(0, NULL) failed !\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
long_dir = (WCHAR *)GFX2_malloc(sizeof(WCHAR) * size_long);
|
||||||
|
if (long_dir == NULL)
|
||||||
|
return NULL;
|
||||||
|
if (GetCurrentDirectoryW(size_long, long_dir) == 0)
|
||||||
|
{
|
||||||
|
GFX2_Log(GFX2_ERROR, "GetCurrentDirectoryW(%u, %p) failed !\n", (unsigned)size_long, long_dir);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// then convert to "short" path (ie C:\PROGRA~1\...)
|
||||||
|
size_short = (size_t)GetShortPathNameW(long_dir, NULL, 0);
|
||||||
|
if (size_short == 0)
|
||||||
|
{
|
||||||
|
GFX2_Log(GFX2_ERROR, "GetShortPathNameW(%p, NULL, 0) failed !\n", long_dir);
|
||||||
|
free(long_dir);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
short_dir = (WCHAR *)GFX2_malloc(sizeof(WCHAR) * size_short);
|
||||||
|
if (short_dir == NULL)
|
||||||
|
{
|
||||||
|
free(long_dir);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (GetShortPathNameW(long_dir, short_dir, size_short) == 0)
|
||||||
|
{
|
||||||
|
GFX2_Log(GFX2_ERROR, "GetShortPathNameW(%p, %p, %u) failed !\n", long_dir, short_dir, (unsigned)size_short);
|
||||||
|
free(long_dir);
|
||||||
|
free(short_dir);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// now copy / return the path
|
||||||
if (buf == NULL)
|
if (buf == NULL)
|
||||||
{
|
{
|
||||||
size = (size_t)GetCurrentDirectoryA(0, NULL);
|
size = size_short;
|
||||||
if (size == 0)
|
|
||||||
return NULL;
|
|
||||||
buf = (char *)GFX2_malloc(size);
|
buf = (char *)GFX2_malloc(size);
|
||||||
if (buf == NULL)
|
if (buf == NULL)
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
if (GetCurrentDirectoryA(size, buf) == 0)
|
|
||||||
return NULL;
|
|
||||||
if (unicode != NULL)
|
|
||||||
{
|
|
||||||
WCHAR * temp = (WCHAR *)GFX2_malloc(sizeof(WCHAR) * size);
|
|
||||||
if (temp != NULL)
|
|
||||||
{
|
{
|
||||||
size_t i;
|
free(long_dir);
|
||||||
for (i = 0; i < size - 1 && buf[i] != '\0'; i++)
|
free(short_dir);
|
||||||
temp[i] = (WCHAR)buf[i] & 0x00ff;
|
return NULL;
|
||||||
temp[i] = 0;
|
|
||||||
size = GetLongPathNameW(temp, NULL, 0);
|
|
||||||
*unicode = (word *)GFX2_malloc(size*sizeof(word));
|
|
||||||
if (*unicode != NULL)
|
|
||||||
GetLongPathNameW(temp, (WCHAR *)*unicode, size);
|
|
||||||
free(temp);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for (i = 0; i < (size - 1) && short_dir[i]; i++)
|
||||||
|
buf[i] = (char)short_dir[i];
|
||||||
|
buf[i] = '\0';
|
||||||
|
free(short_dir);
|
||||||
|
if (unicode != NULL)
|
||||||
|
*unicode = long_dir;
|
||||||
|
else
|
||||||
|
free(long_dir);
|
||||||
return buf;
|
return buf;
|
||||||
#else
|
#else
|
||||||
char * ret = getcwd(buf, size);
|
char * ret = getcwd(buf, size);
|
||||||
@ -1036,6 +1071,7 @@ char * Get_current_directory(char * buf, word * * unicode, size_t size)
|
|||||||
|
|
||||||
int Change_directory(const char * path)
|
int Change_directory(const char * path)
|
||||||
{
|
{
|
||||||
|
GFX2_Log(GFX2_DEBUG, "Change_directory(\"%s\")\n", path);
|
||||||
#if defined(__WIN32__) || defined(WIN32)
|
#if defined(__WIN32__) || defined(WIN32)
|
||||||
return (SetCurrentDirectoryA(path) ? 0 : -1);
|
return (SetCurrentDirectoryA(path) ? 0 : -1);
|
||||||
#else
|
#else
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user