properly handle long filenames of preloade files
This commit is contained in:
parent
e36a62abe3
commit
05d6a4b3dd
91
src/main.c
91
src/main.c
@ -546,6 +546,69 @@ CT_ASSERT(sizeof(T_Components)==3);
|
|||||||
// when sizeof(T_Palette) is not 768.
|
// when sizeof(T_Palette) is not 768.
|
||||||
CT_ASSERT(sizeof(T_Palette)==768);
|
CT_ASSERT(sizeof(T_Palette)==768);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a file name to unicode characters
|
||||||
|
*
|
||||||
|
* @param filename_unicode the output buffer of MAX_PATH_CHARACTERS wide characters
|
||||||
|
* @param filename the input file name
|
||||||
|
* @param directory the input file directory
|
||||||
|
* @return 0 if no conversion has taken place.
|
||||||
|
* @return 1 if the unicode filename has been retrieved
|
||||||
|
*/
|
||||||
|
static int Get_Unicode_Filename(word * filename_unicode, const char * filename, const char * directory)
|
||||||
|
{
|
||||||
|
#if defined(WIN32)
|
||||||
|
int i = 0, j = 0;
|
||||||
|
WCHAR shortPath[MAX_PATH_CHARACTERS];
|
||||||
|
WCHAR longPath[MAX_PATH_CHARACTERS];
|
||||||
|
|
||||||
|
// copy the full path to a wide character buffer :
|
||||||
|
while (directory[0] != '\0')
|
||||||
|
shortPath[i++] = *directory++;
|
||||||
|
if (i > 0 && shortPath[i-1] != '\\') // add path separator only if it is missing
|
||||||
|
shortPath[i++] = '\\';
|
||||||
|
while (filename[0] != '\0')
|
||||||
|
shortPath[i++] = *filename++;
|
||||||
|
shortPath[i++] = 0;
|
||||||
|
if (GetLongPathNameW(shortPath, longPath, MAX_PATH_CHARACTERS) == 0)
|
||||||
|
return 0;
|
||||||
|
i = 0;
|
||||||
|
while (longPath[j] != 0)
|
||||||
|
{
|
||||||
|
if (longPath[j] == '\\')
|
||||||
|
i = 0;
|
||||||
|
else
|
||||||
|
filename_unicode[i++] = longPath[j];
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
filename_unicode[i++] = 0;
|
||||||
|
return 1;
|
||||||
|
#elif defined(ENABLE_FILENAMES_ICONV)
|
||||||
|
char * input = filename;
|
||||||
|
size_t inbytesleft = strlen(filename);
|
||||||
|
char * output = (char *)filename_unicode;
|
||||||
|
size_t outbytesleft = (MAX_PATH_CHARACTERS - 1) * 2;
|
||||||
|
(void)directory; // unused
|
||||||
|
if (cd_utf16 != (iconv_t)-1)
|
||||||
|
{
|
||||||
|
size_t r = iconv(cd_utf16, &input, &inbytesleft, &output, &outbytesleft);
|
||||||
|
if (r != (size_t)-1)
|
||||||
|
{
|
||||||
|
output[0] = '\0';
|
||||||
|
output[1] = '\0';
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
#else
|
||||||
|
(void)filename_unicode;
|
||||||
|
(void)filename;
|
||||||
|
(void)directory;
|
||||||
|
// not implemented
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
// ------------------------ Initialiser le programme -------------------------
|
// ------------------------ Initialiser le programme -------------------------
|
||||||
// Returns 0 on fail
|
// Returns 0 on fail
|
||||||
int Init_program(int argc,char * argv[])
|
int Init_program(int argc,char * argv[])
|
||||||
@ -558,12 +621,12 @@ int Init_program(int argc,char * argv[])
|
|||||||
int file_in_command_line;
|
int file_in_command_line;
|
||||||
T_Gradient_array initial_gradients;
|
T_Gradient_array initial_gradients;
|
||||||
static char main_filename [MAX_PATH_CHARACTERS];
|
static char main_filename [MAX_PATH_CHARACTERS];
|
||||||
#ifdef ENABLE_FILENAMES_ICONV
|
|
||||||
static word main_filename_unicode[MAX_PATH_CHARACTERS];
|
|
||||||
#endif
|
|
||||||
static char main_directory[MAX_PATH_CHARACTERS];
|
static char main_directory[MAX_PATH_CHARACTERS];
|
||||||
static char spare_filename [MAX_PATH_CHARACTERS];
|
static char spare_filename [MAX_PATH_CHARACTERS];
|
||||||
static char spare_directory[MAX_PATH_CHARACTERS];
|
static char spare_directory[MAX_PATH_CHARACTERS];
|
||||||
|
#if defined(ENABLE_FILENAMES_ICONV) || defined(WIN32)
|
||||||
|
static word filename_unicode[MAX_PATH_CHARACTERS];
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(__MINT__)
|
#if defined(__MINT__)
|
||||||
printf("===============================\n");
|
printf("===============================\n");
|
||||||
@ -1022,6 +1085,8 @@ int Init_program(int argc,char * argv[])
|
|||||||
case 2:
|
case 2:
|
||||||
// Load this file
|
// Load this file
|
||||||
Init_context_layered_image(&context, spare_filename, spare_directory);
|
Init_context_layered_image(&context, spare_filename, spare_directory);
|
||||||
|
if (Get_Unicode_Filename(filename_unicode, spare_filename, spare_directory))
|
||||||
|
context.File_name_unicode = filename_unicode;
|
||||||
Load_image(&context);
|
Load_image(&context);
|
||||||
Destroy_context(&context);
|
Destroy_context(&context);
|
||||||
Redraw_layered_image();
|
Redraw_layered_image();
|
||||||
@ -1031,24 +1096,8 @@ int Init_program(int argc,char * argv[])
|
|||||||
// no break ! proceed with the other file now
|
// no break ! proceed with the other file now
|
||||||
case 1:
|
case 1:
|
||||||
Init_context_layered_image(&context, main_filename, main_directory);
|
Init_context_layered_image(&context, main_filename, main_directory);
|
||||||
#ifdef ENABLE_FILENAMES_ICONV
|
if (Get_Unicode_Filename(filename_unicode, main_filename, main_directory))
|
||||||
{
|
context.File_name_unicode = filename_unicode;
|
||||||
char * input = main_filename;
|
|
||||||
size_t inbytesleft = strlen(main_filename);
|
|
||||||
char * output = (char *)main_filename_unicode;
|
|
||||||
size_t outbytesleft = sizeof(main_filename_unicode) - 2;
|
|
||||||
if (cd_utf16 != (iconv_t)-1)
|
|
||||||
{
|
|
||||||
size_t r = iconv(cd_utf16, &input, &inbytesleft, &output, &outbytesleft);
|
|
||||||
if (r != (size_t)-1)
|
|
||||||
{
|
|
||||||
output[0] = '\0';
|
|
||||||
output[1] = '\0';
|
|
||||||
context.File_name_unicode = main_filename_unicode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
Load_image(&context);
|
Load_image(&context);
|
||||||
Destroy_context(&context);
|
Destroy_context(&context);
|
||||||
Redraw_layered_image();
|
Redraw_layered_image();
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user