diff --git a/src/Makefile b/src/Makefile index f77a8426..a7ddc00f 100644 --- a/src/Makefile +++ b/src/Makefile @@ -200,7 +200,8 @@ endif LUALOPT = -llua endif COPT = -W -Wall -c -g $(shell sdl-config --cflags) $(TTFCOPT) -I/boot/common/include $(LUACOPT) - LOPT = $(shell sdl-config --libs) -lSDL_image -lpng -ljpeg -lz $(TTFLOPT) -lfreetype -lbe $(LUALOPT) + COPT += -DENABLE_FILENAMES_ICONV + LOPT = $(shell sdl-config --libs) -lSDL_image -lpng -ljpeg -lz $(TTFLOPT) -lfreetype -lbe $(LUALOPT) -liconv CC = gcc #Append the gcc kind to the objdir (gcc2 or gcc4) to avoid conflicts when switching from one to other. OBJKIND = $(shell gcc -dumpversion) @@ -364,6 +365,8 @@ endif CC = gcc OBJDIR = ../obj/unix FCLOPT = -lfontconfig + # enable UTF8 filename translation + COPT += -DENABLE_FILENAMES_ICONV endif endif endif diff --git a/src/filesel.c b/src/filesel.c index 0d817be8..221ff2f3 100644 --- a/src/filesel.c +++ b/src/filesel.c @@ -230,6 +230,21 @@ char * Format_filename(const char * fname, word max_length, int type) int c; int other_cursor; int pos_last_dot; +#ifdef ENABLE_FILENAMES_ICONV + /* convert file name from UTF8 to ANSI */ + char converted_fname[MAX_PATH_CHARACTERS]; + { + char * input = (char *)fname; + size_t inbytesleft = strlen(fname); + char * output = converted_fname; + size_t outbytesleft = sizeof(converted_fname)-1; + if(cd != (iconv_t)-1 && (ssize_t)iconv(cd, &input, &inbytesleft, &output, &outbytesleft) >= 0) + { + *output = '\0'; + fname = converted_fname; + } + } +#endif /* ENABLE_FILENAMES_ICONV */ // safety if (max_length>40) @@ -1064,19 +1079,34 @@ void Print_current_directory(void) // Affiche Selector->Directory sur 37 caractères // { + char converted_name[MAX_PATH_CHARACTERS]; char temp_name[MAX_DISPLAYABLE_PATH+1]; // Nom tronqué int length; // length du répertoire courant int index; // index de parcours de la chaine complète + strncpy(converted_name,Selector->Directory,sizeof(converted_name)); + converted_name[sizeof(converted_name)-1] = '\0'; +#ifdef ENABLE_FILENAMES_ICONV + { + /* convert file name from UTF8 to ANSI */ + char * input = Selector->Directory; + size_t inbytesleft = strlen(input); + char * output = converted_name; + size_t outbytesleft = sizeof(converted_name)-1; + if(cd != (iconv_t)-1 && (ssize_t)iconv(cd, &input, &inbytesleft, &output, &outbytesleft) >= 0) + *output = '\0'; + } +#endif /* ENABLE_FILENAMES_ICONV */ + Window_rectangle(10,84,37*8,8,MC_Light); - length=strlen(Selector->Directory); + length=strlen(converted_name); if (length>MAX_DISPLAYABLE_PATH) { // Doh! il va falloir tronquer le répertoire (bouh !) // On commence par copier bêtement les 3 premiers caractères (e.g. "C:\") for (index=0;index<3;index++) - temp_name[index]=Selector->Directory[index]; + temp_name[index]=converted_name[index]; // On y rajoute 3 petits points: strcpy(temp_name+3,"..."); @@ -1084,12 +1114,12 @@ void Print_current_directory(void) // Ensuite, on cherche un endroit à partir duquel on pourrait loger tout // le reste de la chaine (Ouaaaaaah!!! Vachement fort le mec!!) for (index++;indexDirectory[index]==PATH_SEPARATOR[0]) && + if ( (converted_name[index]==PATH_SEPARATOR[0]) && (length-index<=MAX_DISPLAYABLE_PATH-6) ) { // Ouf: on vient de trouver un endroit dans la chaîne à partir duquel // on peut faire la copie: - strcpy(temp_name+6,Selector->Directory+index); + strcpy(temp_name+6,converted_name+index); break; } @@ -1097,7 +1127,7 @@ void Print_current_directory(void) Print_in_window(10,84,temp_name,MC_Black,MC_Light); } else // Ahhh! La chaîne peut loger tranquillement dans la fenêtre - Print_in_window(10,84,Selector->Directory,MC_Black,MC_Light); + Print_in_window(10,84,converted_name,MC_Black,MC_Light); Update_window_area(10,84,37*8,8); } @@ -1107,8 +1137,20 @@ void Print_current_directory(void) // void Print_filename_in_fileselector(void) { + char filename[32]; + strncpy(filename, Selector_filename, sizeof(filename)); +#ifdef ENABLE_FILENAMES_ICONV + { + char * input = (char *)Selector_filename; + size_t inbytesleft = strlen(Selector_filename); + char * output = filename; + size_t outbytesleft = sizeof(filename)-1; + if(cd != (iconv_t)-1 && (ssize_t)iconv(cd, &input, &inbytesleft, &output, &outbytesleft) >= 0) + *output = '\0'; + } +#endif /* ENABLE_FILENAMES_ICONV */ Window_rectangle(82,48,27*8,8,MC_Light); - Print_in_window_limited(82,48,Selector_filename,27,MC_Black,MC_Light); + Print_in_window_limited(82,48,filename,27,MC_Black,MC_Light); Update_window_area(82,48,27*8,8); } @@ -1721,6 +1763,8 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context } break; case 8 : // Saisie du nom de fichier + { + char filename_ansi[256]; // Save the filename strcpy(save_filename, Selector_filename); @@ -1734,8 +1778,31 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context // current name is a highlighted directory Selector_filename[0]='\0'; } - if (Readline(82,48,Selector_filename,27,INPUT_TYPE_FILENAME)) + strncpy(filename_ansi, Selector_filename, sizeof(filename_ansi)); +#ifdef ENABLE_FILENAMES_ICONV + { /* convert from UTF8 to ANSI */ + char * input = (char *)Selector_filename; + size_t inbytesleft = strlen(input); + char * output = filename_ansi; + size_t outbytesleft = sizeof(filename_ansi)-1; + if(cd != (iconv_t)-1 && (ssize_t)iconv(cd, &input, &inbytesleft, &output, &outbytesleft) >= 0) + *output = '\0'; + } +#endif /* ENABLE_FILENAMES_ICONV */ + if (Readline(82,48,filename_ansi,27,INPUT_TYPE_FILENAME)) { +#ifdef ENABLE_FILENAMES_ICONV + /* convert back from ANSI to UTF8 */ + char * input = (char *)filename_ansi; + size_t inbytesleft = strlen(input); + char * output = Selector_filename; + size_t outbytesleft = sizeof(Selector_filename)-1; + if(cd_inv != (iconv_t)-1 && (ssize_t)iconv(cd_inv, &input, &inbytesleft, &output, &outbytesleft) >= 0) + *output = '\0'; + else +#endif /* ENABLE_FILENAMES_ICONV */ + strncpy(Selector_filename, filename_ansi, sizeof(Selector_filename)); + // On regarde s'il faut rajouter une extension. C'est-à-dire s'il // n'y a pas de '.' dans le nom du fichier. for(temp=0,dummy=0; ((Selector_filename[temp]) && (!dummy)); temp++) @@ -1792,6 +1859,7 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context } Display_cursor(); break; + } case 9 : // Volume Select Hide_cursor(); // Comme on tombe sur un disque qu'on connait pas, on se place en diff --git a/src/global.h b/src/global.h index 0e23822f..71ed5bb5 100644 --- a/src/global.h +++ b/src/global.h @@ -854,6 +854,18 @@ GFX2_GLOBAL signed char File_error; /// Current line number when reading/writing gfx2.ini GFX2_GLOBAL int Line_number_in_INI_file; +// -- For iconv + +#ifdef ENABLE_FILENAMES_ICONV + +#include + +#define TOCODE "CP1252" +#define FROMCODE "UTF-8" +GFX2_GLOBAL iconv_t cd; +GFX2_GLOBAL iconv_t cd_inv; +#endif /* ENABLE_FILENAMES_ICONV */ + // -- Specific to SDL /// Pointer to the program's screen. diff --git a/src/main.c b/src/main.c index 7ce1869f..c2bdf926 100644 --- a/src/main.c +++ b/src/main.c @@ -469,6 +469,13 @@ int Init_program(int argc,char * argv[]) getcwd(Main_selector.Directory,MAX_PATH_CHARACTERS); #endif +#ifdef ENABLE_FILENAMES_ICONV + // Initialisation de iconv + // utilisé pour convertir les noms de fichiers + cd = iconv_open(TOCODE, FROMCODE); // From UTF8 to ANSI + cd_inv = iconv_open(FROMCODE, TOCODE); // From ANSI to UTF8 +#endif /* ENABLE_FILENAMES_ICONV */ + // On en profite pour le mémoriser dans le répertoire principal: strcpy(Initial_directory,Main_selector.Directory); diff --git a/src/text.c b/src/text.c index 123085ce..6c986021 100644 --- a/src/text.c +++ b/src/text.c @@ -335,11 +335,12 @@ void Init_text(void) #ifdef USE_FC { FcStrList* dirs; + FcChar8 * fdir; dirs = FcConfigGetFontDirs(NULL); - char* fdir = FcStrListNext(dirs); + fdir = FcStrListNext(dirs); while(fdir != NULL) { - For_each_file(fdir,Add_font); + For_each_file((char *)fdir,Add_font); fdir = FcStrListNext(dirs); } diff --git a/src/windows.c b/src/windows.c index 6ad0a021..d8535585 100644 --- a/src/windows.c +++ b/src/windows.c @@ -799,10 +799,23 @@ void Print_filename(void) // Determine maximum size, in characters max_size = 12 + (Screen_width / Menu_factor_X - 320) / 8; - string_size = strlen(Main_backups->Pages->Filename); - // Partial copy of the name - strncpy(display_string, Main_backups->Pages->Filename, max_size); + { +#ifdef ENABLE_FILENAMES_ICONV + char * input = Main_backups->Pages->Filename; + size_t inbytesleft = strlen(input); + char * output = display_string; + size_t outbytesleft = sizeof(display_string)-1; + if(cd != (iconv_t)-1 && (ssize_t)iconv(cd, &input, &inbytesleft, &output, &outbytesleft) >= 0) + *output = '\0'; + else +#endif /* ENABLE_FILENAMES_ICONV */ + { + strncpy(display_string, Main_backups->Pages->Filename, sizeof(display_string)-1); + display_string[sizeof(display_string)-1] = '\0'; + } + } + string_size = strlen(display_string); display_string[max_size]='\0'; if (string_size > max_size)