Ticket #10: issue10_a.patch

File issue10_a.patch, 6.9 KB (added by miniupnp, 7 years ago)

fully working patch

  • global.h

     
    854854/// Current line number when reading/writing gfx2.ini
    855855GFX2_GLOBAL int Line_number_in_INI_file;
    856856
     857// -- For iconv
     858
     859#define TOCODE   "CP1252"
     860#define FROMCODE "UTF-8"
     861GFX2_GLOBAL iconv_t cd;
     862GFX2_GLOBAL iconv_t cd_inv;
     863
    857864// -- Specific to SDL
    858865
    859866/// Pointer to the program's screen.
  • filesel.c

     
    230230  int         c;
    231231  int         other_cursor;
    232232  int         pos_last_dot;
     233  char        converted_fname[MAX_PATH_CHARACTERS];
    233234
     235  {
     236    char * input = (char *)fname;
     237    size_t inbytesleft = strlen(fname);
     238    char * output = converted_fname;
     239    size_t outbytesleft = sizeof(converted_fname)-1;
     240    if(cd != (iconv_t)-1 && (ssize_t)iconv(cd, &input, &inbytesleft, &output, &outbytesleft) >= 0)
     241    {
     242      *output = '\0';
     243      fname = converted_fname;
     244    }
     245  }
    234246  // safety
    235247  if (max_length>40)
    236248    max_length=40;
     
    10641076// Affiche Selector->Directory sur 37 caractères
    10651077//
    10661078{
     1079  char converted_name[MAX_PATH_CHARACTERS];
    10671080  char temp_name[MAX_DISPLAYABLE_PATH+1]; // Nom tronqué
    10681081  int  length; // length du répertoire courant
    10691082  int  index;   // index de parcours de la chaine complète
    10701083
     1084  strncpy(converted_name,Selector->Directory,sizeof(converted_name));
     1085  converted_name[sizeof(converted_name)-1] = '\0';
     1086  {
     1087    char * input = Selector->Directory;
     1088    size_t inbytesleft = strlen(input);
     1089    char * output = converted_name;
     1090    size_t outbytesleft = sizeof(converted_name)-1;
     1091    if(cd != (iconv_t)-1 && (ssize_t)iconv(cd, &input, &inbytesleft, &output, &outbytesleft) >= 0)
     1092    {
     1093      *output = '\0';
     1094    }
     1095  }
     1096
    10711097  Window_rectangle(10,84,37*8,8,MC_Light);
    10721098
    1073   length=strlen(Selector->Directory);
     1099  length=strlen(converted_name);
    10741100  if (length>MAX_DISPLAYABLE_PATH)
    10751101  { // Doh! il va falloir tronquer le répertoire (bouh !)
    10761102
    10771103    // On commence par copier bêtement les 3 premiers caractères (e.g. "C:\")
    10781104    for (index=0;index<3;index++)
    1079       temp_name[index]=Selector->Directory[index];
     1105      temp_name[index]=converted_name[index];
    10801106
    10811107    // On y rajoute 3 petits points:
    10821108    strcpy(temp_name+3,"...");
     
    10841110    //  Ensuite, on cherche un endroit à partir duquel on pourrait loger tout
    10851111    // le reste de la chaine (Ouaaaaaah!!! Vachement fort le mec!!)
    10861112    for (index++;index<length;index++)
    1087       if ( (Selector->Directory[index]==PATH_SEPARATOR[0]) &&
     1113      if ( (converted_name[index]==PATH_SEPARATOR[0]) &&
    10881114           (length-index<=MAX_DISPLAYABLE_PATH-6) )
    10891115      {
    10901116        // Ouf: on vient de trouver un endroit dans la chaîne à partir duquel
    10911117        // on peut faire la copie:
    1092         strcpy(temp_name+6,Selector->Directory+index);
     1118        strcpy(temp_name+6,converted_name+index);
    10931119        break;
    10941120      }
    10951121
     
    10971123    Print_in_window(10,84,temp_name,MC_Black,MC_Light);
    10981124  }
    10991125  else // Ahhh! La chaîne peut loger tranquillement dans la fenêtre
    1100     Print_in_window(10,84,Selector->Directory,MC_Black,MC_Light);
     1126    Print_in_window(10,84,converted_name,MC_Black,MC_Light);
    11011127   
    11021128  Update_window_area(10,84,37*8,8);
    11031129}
     
    11071133//
    11081134void Print_filename_in_fileselector(void)
    11091135{
     1136  char filename[32];
     1137  strncpy(filename, Selector_filename, sizeof(filename));
     1138  {
     1139    char * input = (char *)Selector_filename;
     1140    size_t inbytesleft = strlen(Selector_filename);
     1141    char * output = filename;
     1142    size_t outbytesleft = sizeof(filename)-1;
     1143    if(cd != (iconv_t)-1 && (ssize_t)iconv(cd, &input, &inbytesleft, &output, &outbytesleft) >= 0)
     1144    {
     1145      *output = '\0';
     1146    }
     1147  }
    11101148  Window_rectangle(82,48,27*8,8,MC_Light);
    1111   Print_in_window_limited(82,48,Selector_filename,27,MC_Black,MC_Light);
     1149  Print_in_window_limited(82,48,filename,27,MC_Black,MC_Light);
    11121150  Update_window_area(82,48,27*8,8);
    11131151}
    11141152
     
    17341772            // current name is a highlighted directory
    17351773            Selector_filename[0]='\0';
    17361774        }
    1737         if (Readline(82,48,Selector_filename,27,INPUT_TYPE_FILENAME))
     1775        char filename_ansi[256];
    17381776        {
     1777          char * input = (char *)Selector_filename;
     1778          size_t inbytesleft = strlen(input);
     1779          char * output = filename_ansi;
     1780          size_t outbytesleft = sizeof(filename_ansi)-1;
     1781          if(cd != (iconv_t)-1 && (ssize_t)iconv(cd, &input, &inbytesleft, &output, &outbytesleft) >= 0)
     1782            *output = '\0';
     1783          else
     1784            strncpy(filename_ansi, Selector_filename, sizeof(filename_ansi));
     1785        }
     1786        if (Readline(82,48,filename_ansi,27,INPUT_TYPE_FILENAME))
     1787        {
     1788          char * input = (char *)filename_ansi;
     1789          size_t inbytesleft = strlen(input);
     1790          char * output = Selector_filename;
     1791          size_t outbytesleft = sizeof(Selector_filename)-1;
     1792          if(cd_inv != (iconv_t)-1 && (ssize_t)iconv(cd_inv, &input, &inbytesleft, &output, &outbytesleft) >= 0)
     1793            *output = '\0';
     1794          else
     1795            strncpy(Selector_filename, filename_ansi, sizeof(Selector_filename));
     1796
    17391797          //   On regarde s'il faut rajouter une extension. C'est-à-dire s'il
    17401798          // n'y a pas de '.' dans le nom du fichier.
    17411799          for(temp=0,dummy=0; ((Selector_filename[temp]) && (!dummy)); temp++)
  • windows.c

     
    799799  // Determine maximum size, in characters
    800800  max_size = 12 + (Screen_width / Menu_factor_X - 320) / 8;
    801801 
    802   string_size = strlen(Main_backups->Pages->Filename);
    803  
    804802  // Partial copy of the name
    805   strncpy(display_string, Main_backups->Pages->Filename, max_size);
     803  {
     804    char * input = Main_backups->Pages->Filename;
     805    size_t inbytesleft = strlen(input);
     806    char * output = display_string;
     807    size_t outbytesleft = sizeof(display_string)-1;
     808    if(cd != (iconv_t)-1 && (ssize_t)iconv(cd, &input, &inbytesleft, &output, &outbytesleft) >= 0)
     809      *output = '\0';
     810    else
     811    {
     812      strncpy(display_string, Main_backups->Pages->Filename, sizeof(display_string)-1);
     813      display_string[sizeof(display_string)-1] = '\0';
     814    }
     815  }
     816  string_size = strlen(display_string);
    806817  display_string[max_size]='\0';
    807818
    808819  if (string_size > max_size)
  • main.c

     
    469469  getcwd(Main_selector.Directory,MAX_PATH_CHARACTERS);
    470470#endif
    471471
     472  // Initialisation de iconv
     473  // utilisé pour convertir les noms de fichiers
     474  cd = iconv_open(TOCODE, FROMCODE);  // From UTF8 to ANSI
     475  cd_inv = iconv_open(FROMCODE, TOCODE);  // From ANSI to UTF8
     476
    472477  // On en profite pour le mémoriser dans le répertoire principal:
    473478  strcpy(Initial_directory,Main_selector.Directory);
    474479