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;
 | 
			
		||||
#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)
 | 
			
		||||
  {
 | 
			
		||||
    size = (size_t)GetCurrentDirectoryA(0, NULL);
 | 
			
		||||
    if (size == 0)
 | 
			
		||||
      return NULL;
 | 
			
		||||
    size = size_short;
 | 
			
		||||
    buf = (char *)GFX2_malloc(size);
 | 
			
		||||
    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;
 | 
			
		||||
      for (i = 0; i < size - 1 && buf[i] != '\0'; i++)
 | 
			
		||||
        temp[i] = (WCHAR)buf[i] & 0x00ff;
 | 
			
		||||
      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);
 | 
			
		||||
      free(long_dir);
 | 
			
		||||
      free(short_dir);
 | 
			
		||||
      return NULL;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  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;
 | 
			
		||||
#else
 | 
			
		||||
  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)
 | 
			
		||||
{
 | 
			
		||||
  GFX2_Log(GFX2_DEBUG, "Change_directory(\"%s\")\n", path);
 | 
			
		||||
#if defined(__WIN32__) || defined(WIN32)
 | 
			
		||||
  return (SetCurrentDirectoryA(path) ? 0 : -1);
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user