From ad219c84d2ec474039db23bce4f84ff4847c537e Mon Sep 17 00:00:00 2001 From: Thomas Bernard Date: Fri, 16 Feb 2018 12:45:07 +0100 Subject: [PATCH] Make saving of unicode named files work under Win32 the "Long" name is converted to short (DOS 8.3) name as soon as possible. --- src/buttons.c | 1 + src/filesel.c | 8 +++++++- src/loadsave.c | 27 +++++++++++++++++++++++++++ src/unicode.c | 9 +++++++++ src/unicode.h | 3 +++ 5 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/buttons.c b/src/buttons.c index 4a96280b..1db089af 100644 --- a/src/buttons.c +++ b/src/buttons.c @@ -3507,6 +3507,7 @@ void Save_picture(enum CONTEXT_TYPE type) Main.image_is_modified=0; Main.fileformat=save_context.Format; strcpy(Main.backups->Pages->Filename, save_context.File_name); + Unicode_strlcpy(Main.backups->Pages->Filename_unicode, save_context.File_name_unicode, MAX_PATH_CHARACTERS); strcpy(Main.backups->Pages->File_directory, save_context.File_directory); } if (type == CONTEXT_BRUSH) diff --git a/src/filesel.c b/src/filesel.c index 17be168f..b45bd55e 100644 --- a/src/filesel.c +++ b/src/filesel.c @@ -1939,7 +1939,13 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context WCHAR temp_str[MAX_PATH_CHARACTERS]; if (GetShortPathNameW((WCHAR *)filename_unicode, temp_str, MAX_PATH_CHARACTERS) == 0) { - strcpy(filename_ansi, "*TEMP*"); + // generate a temporary ansi name + int i; + for (i = 0; i < MAX_PATH_CHARACTERS - 1 && filename_unicode[i] != 0; i++) + { + filename_ansi[i] = (filename_unicode[i] < 256) ? (byte)filename_unicode[i] : '_'; + } + filename_ansi[i] = '\0'; } else { diff --git a/src/loadsave.c b/src/loadsave.c index be052f41..8f1a166a 100644 --- a/src/loadsave.c +++ b/src/loadsave.c @@ -1754,7 +1754,34 @@ void Delete_safety_backups(void) FILE * Open_file_write(T_IO_Context *context) { char filename[MAX_PATH_CHARACTERS]; // filename with full path +#if defined(WIN32) + WCHAR filename_unicode[MAX_PATH_CHARACTERS]; + FILE * f; + if (context->File_name_unicode != NULL) + { + Unicode_char_strlcpy((word *)filename_unicode, context->File_directory, MAX_PATH_CHARACTERS); + Unicode_char_strlcat((word *)filename_unicode, PATH_SEPARATOR, MAX_PATH_CHARACTERS); + Unicode_strlcat((word *)filename_unicode, context->File_name_unicode, MAX_PATH_CHARACTERS); + + f = _wfopen(filename_unicode, L"wb"); + if (f != NULL) + { + // Now the file has been created, retrieve its short (ASCII) name + WCHAR shortpath[MAX_PATH_CHARACTERS]; + DWORD len = GetShortPathNameW(filename_unicode, shortpath, MAX_PATH_CHARACTERS); + if (len > 0 && len < MAX_PATH_CHARACTERS) + { + DWORD start, index; + for (start = len; start > 0 && shortpath[start-1] != '\\'; start--); + for (index = 0; index < MAX_PATH_CHARACTERS - 1 && index < len - start; index++) + context->File_name[index] = shortpath[start + index]; + context->File_name[index] = '\0'; + } + } + return f; + } +#endif Get_full_filename(filename, context->File_name, context->File_directory); return fopen(filename, "wb"); diff --git a/src/unicode.c b/src/unicode.c index 341ffde1..cfde19a0 100644 --- a/src/unicode.c +++ b/src/unicode.c @@ -64,6 +64,15 @@ void Unicode_strlcpy(word * dst, const word * src, size_t len) *dst = 0; } +/// concatenate unicode string +void Unicode_strlcat(word * dst, const word * src, size_t len) +{ + size_t dst_len = Unicode_strlen(dst); + if (dst_len >= len) + return; + Unicode_strlcpy(dst + dst_len, src, len - dst_len); +} + /// Compare an unicode string with a regular Latin1 string int Unicode_char_strcmp(const word * s1, const char * s2) { diff --git a/src/unicode.h b/src/unicode.h index 10d353c2..4e88473e 100644 --- a/src/unicode.h +++ b/src/unicode.h @@ -33,6 +33,9 @@ word * Unicode_strdup(const word * str); /// Copy unicode string void Unicode_strlcpy(word * dst, const word * src, size_t len); +/// Append unicode string to another +void Unicode_strlcat(word * dst, const word * src, size_t len); + /// Compare an unicode string with a regular Latin1 string int Unicode_char_strcmp(const word * s1, const char * s2);