get rid of MAX_PATH_CHARACTERS in T_Page and T_Selector_Settings

strdup() the dynammicaly allocated filename and directory strings
This commit is contained in:
Thomas Bernard 2019-02-15 13:03:18 +01:00
parent 98811b6363
commit 79446a9c72
No known key found for this signature in database
GPG Key ID: 0FF11B67A5C0863C
12 changed files with 236 additions and 190 deletions

View File

@ -3176,35 +3176,23 @@ void Load_picture(enum CONTEXT_TYPE type)
byte old_cursor_shape;
int new_mode;
T_IO_Context context;
static char filename [MAX_PATH_CHARACTERS];
static word filename_unicode[MAX_PATH_CHARACTERS];
static char directory[MAX_PATH_CHARACTERS];
word * filename_unicode = NULL;
T_Selector_settings * selector;
switch (type)
{
case CONTEXT_MAIN_IMAGE:
strcpy(filename, Main.backups->Pages->Filename);
Unicode_strlcpy(filename_unicode, Main.backups->Pages->Filename_unicode, MAX_PATH_CHARACTERS);
strcpy(directory, Main.backups->Pages->File_directory);
Init_context_layered_image(&context, filename, directory);
filename_unicode = Main.backups->Pages->Filename_unicode;
Init_context_layered_image(&context, Main.backups->Pages->Filename, Main.backups->Pages->File_directory);
selector = &Main.selector;
break;
case CONTEXT_BRUSH:
strcpy(filename, Brush_filename);
if (Brush_filename_unicode != NULL)
Unicode_strlcpy(filename_unicode, Brush_filename_unicode, MAX_PATH_CHARACTERS);
else
filename_unicode[0] = 0;
strcpy(directory, Brush_file_directory);
Init_context_brush(&context, filename, directory);
filename_unicode = Brush_filename_unicode;
Init_context_brush(&context, Brush_filename, Brush_file_directory);
selector = &Brush_selector;
break;
case CONTEXT_PALETTE:
strcpy(filename, "");
filename_unicode[0] = 0;
strcpy(directory, Main.backups->Pages->File_directory);
Init_context_layered_image(&context, filename, directory);
Init_context_layered_image(&context, "", Main.backups->Pages->File_directory);
context.Type = CONTEXT_PALETTE;
context.Format = FORMAT_PAL;
selector = &Palette_selector;
@ -3212,7 +3200,7 @@ void Load_picture(enum CONTEXT_TYPE type)
default:
return; // DO NOTHING
}
context.File_name_unicode = filename_unicode;
context.File_name_unicode = Unicode_strdup(filename_unicode);
confirm = Button_Load_or_Save(selector, 1, &context);
if (confirm)
@ -3244,14 +3232,14 @@ void Load_picture(enum CONTEXT_TYPE type)
if (type==CONTEXT_BRUSH)
{
free(Brush_filename);
Brush_filename = strdup(context.File_name);
Brush_filename = context.File_name; // "steal" heap string
context.File_name = NULL;
free(Brush_filename_unicode);
if (context.File_name_unicode != NULL && context.File_name_unicode[0] != 0)
Brush_filename_unicode = Unicode_strdup(context.File_name_unicode);
else
Brush_filename_unicode = NULL;
Brush_filename_unicode = context.File_name_unicode; // "steal" heap string
context.File_name_unicode = NULL;
free(Brush_file_directory);
Brush_file_directory = strdup(context.File_directory);
Brush_file_directory = context.File_directory; // "steal" heap string
context.File_directory = NULL;
Brush_fileformat = context.Format;
Tiling_offset_X=0;
@ -3337,12 +3325,12 @@ void Load_picture(enum CONTEXT_TYPE type)
}
}
Destroy_context(&context);
Display_menu();
Display_cursor();
}
Destroy_context(&context);
Hide_cursor();
Print_filename();
Display_cursor();
@ -3503,48 +3491,42 @@ void Save_picture(enum CONTEXT_TYPE type)
byte confirm;
byte old_cursor_shape;
T_IO_Context save_context;
static char filename [MAX_PATH_CHARACTERS];
static word filename_unicode[MAX_PATH_CHARACTERS];
static char directory[MAX_PATH_CHARACTERS];
word * filename_unicode = NULL;
T_Selector_settings * selector;
if (type == CONTEXT_MAIN_IMAGE)
{
strcpy(filename, Main.backups->Pages->Filename);
strcpy(directory, Main.backups->Pages->File_directory);
Unicode_strlcpy(filename_unicode, Main.backups->Pages->Filename_unicode, MAX_PATH_CHARACTERS);
Init_context_layered_image(&save_context, filename, directory);
filename_unicode = Main.backups->Pages->Filename_unicode;
Init_context_layered_image(&save_context, Main.backups->Pages->Filename, Main.backups->Pages->File_directory);
save_context.Format = Main.fileformat;
selector = &Main.selector;
}
else if (type == CONTEXT_BRUSH)
{
strcpy(filename, Brush_filename);
if (Brush_filename_unicode != NULL)
Unicode_strlcpy(filename_unicode, Brush_filename_unicode, MAX_PATH_CHARACTERS);
else
filename_unicode[0] = 0;
strcpy(directory, Brush_file_directory);
Init_context_brush(&save_context, filename, directory);
filename_unicode = Brush_filename_unicode;
Init_context_brush(&save_context, Brush_filename, Brush_file_directory);
save_context.Format = Brush_fileformat;
selector = &Brush_selector;
}
else if (type == CONTEXT_PALETTE)
{
char* pal_filename;
char* dotpos;
strcpy(filename, Main.backups->Pages->Filename);
size_t len = strlen(Main.backups->Pages->Filename);
pal_filename = malloc(len + 4 + 1); // reserve space for ".pal"
memcpy(pal_filename, Main.backups->Pages->Filename, len + 1);
// Replace extension with PAL
dotpos = strrchr(filename, '.');
dotpos = strrchr(pal_filename, '.');
if (dotpos == NULL)
dotpos = filename + strlen(filename);
dotpos = pal_filename + len;
strcpy(dotpos, ".pal");
filename_unicode[0] = 0;
strcpy(directory, Main.backups->Pages->File_directory);
Init_context_layered_image(&save_context, filename, directory);
Init_context_layered_image(&save_context, pal_filename, Main.backups->Pages->File_directory);
save_context.Type = CONTEXT_PALETTE;
free(pal_filename);
// Set format to PAL
save_context.Format = FORMAT_PAL;
selector = &Palette_selector;
@ -3552,7 +3534,7 @@ void Save_picture(enum CONTEXT_TYPE type)
else
return;
save_context.File_name_unicode = filename_unicode;
save_context.File_name_unicode = Unicode_strdup(filename_unicode);
confirm=Button_Load_or_Save(selector, 0, &save_context);
if (confirm && File_exists(save_context.File_name))
@ -3560,7 +3542,7 @@ void Save_picture(enum CONTEXT_TYPE type)
confirm=Confirmation_box("Erase old file ?");
if (confirm && (Config.Backup))
{
char * full_filename = Filepath_append_to_dir(directory, filename);
char * full_filename = Filepath_append_to_dir(save_context.File_directory, save_context.File_name);
Backup_existing_file(full_filename);
free(full_filename);
if (File_error)
@ -3587,22 +3569,28 @@ 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);
free(Main.backups->Pages->Filename);
Main.backups->Pages->Filename = save_context.File_name; // "steal" string from heap
save_context.File_name = NULL;
free(Main.backups->Pages->Filename_unicode);
Main.backups->Pages->Filename_unicode = save_context.File_name_unicode; // "steal" string
save_context.File_name_unicode = NULL;
free(Main.backups->Pages->File_directory);
Main.backups->Pages->File_directory = save_context.File_directory;
save_context.File_directory = NULL;
}
if (type == CONTEXT_BRUSH)
{
Brush_fileformat = save_context.Format;
free(Brush_filename);
Brush_filename = strdup(save_context.File_name);
Brush_filename = save_context.File_name;
save_context.File_name = NULL;
free(Brush_filename_unicode);
if (save_context.File_name_unicode != NULL && save_context.File_name_unicode[0] != 0)
Brush_filename_unicode = Unicode_strdup(save_context.File_name_unicode);
else
Brush_filename_unicode = NULL;
Brush_filename_unicode = save_context.File_name_unicode;
save_context.File_name_unicode = NULL;
free(Brush_file_directory);
Brush_file_directory = strdup(save_context.File_directory);
Brush_file_directory = save_context.File_directory;
save_context.File_directory = NULL;
}
Hide_cursor();
Cursor_shape=old_cursor_shape;

View File

@ -548,8 +548,7 @@ void Read_list_of_files(T_Fileselector *list, byte selected_format)
// correspond au format demandé.
{
struct Read_dir_pdata callback_data;
const char * current_path = NULL;
char curdir[MAX_PATH_CHARACTERS];
char * current_path;
#if defined (__MINT__)
T_Fileselector_item *item=0;
bool bFound=false;
@ -564,7 +563,7 @@ void Read_list_of_files(T_Fileselector *list, byte selected_format)
// Après effacement, il ne reste ni fichier ni répertoire dans la liste
// On lit tous les répertoires:
current_path = Get_current_directory(curdir, NULL, MAX_PATH_CHARACTERS);
current_path = Get_current_directory(NULL, NULL, 0);
For_each_directory_entry(current_path, &callback_data, Read_dir_callback);
@ -619,7 +618,7 @@ void Read_list_of_files(T_Fileselector *list, byte selected_format)
#endif
current_path = NULL;
free(current_path);
if (list->Nb_files==0 && list->Nb_directories==0)
{
@ -1788,7 +1787,9 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context
#endif
Change_directory(context->File_directory);
Get_current_directory(Selector->Directory, Selector->Directory_unicode, MAX_PATH_CHARACTERS);
free(Selector->Directory);
free(Selector->Directory_unicode);
Selector->Directory = Get_current_directory(NULL, &Selector->Directory_unicode, 0);
// Affichage des premiers fichiers visibles:
Reload_list_of_files(Selector->Format_filter,file_scroller);
@ -1803,7 +1804,10 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context
// On initialise le nom de fichier à celui en cours et non pas celui sous
// la barre de sélection
strcpy(Selector_filename, context->File_name);
if (context->File_name_unicode != NULL)
Unicode_strlcpy(Selector_filename_unicode, context->File_name_unicode, 256);
else
Selector_filename_unicode[0] = 0;
// On affiche le nouveau nom de fichier
Print_filename_in_fileselector();
}
@ -2424,7 +2428,9 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context
Extract_filename(previous_directory, Selector->Directory);
}
Get_current_directory(Selector->Directory, Selector->Directory_unicode, MAX_PATH_CHARACTERS);
free(Selector->Directory);
free(Selector->Directory_unicode);
Selector->Directory = Get_current_directory(NULL, &Selector->Directory_unicode, 0);
// read the new directory
Read_list_of_files(&Filelist, Selector->Format_filter);
Sort_list_of_files(&Filelist);
@ -2456,7 +2462,8 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context
}
else // Sinon on essaye de charger ou sauver le fichier
{
strcpy(context->File_directory,Selector->Directory);
free(context->File_directory);
context->File_directory = strdup(Selector->Directory);
context->Format = Selector->Format_filter;
save_or_load_image=1;
}
@ -2516,7 +2523,7 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context
{
Init_context_preview(&preview_context, Selector_filename, Selector->Directory);
preview_context.Format = Selector->Format_filter;
preview_context.File_name_unicode = Selector_filename_unicode;
preview_context.File_name_unicode = Unicode_strdup(Selector_filename_unicode);
}
Hide_cursor();
if (context->Type == CONTEXT_PALETTE)
@ -2536,18 +2543,20 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context
if (has_clicked_ok)
{
free(context->File_name);
free(context->File_name_unicode);
if (load_from_clipboard)
{
strcpy(context->File_name, "CLIPBOARD.GIF");
context->File_name_unicode[0] = 0;
context->File_name = strdup("CLIPBOARD.GIF");
context->File_name_unicode = NULL;
context->Format = FORMAT_CLIPBOARD;
}
else
{
strcpy(context->File_name, Selector_filename);
if (context->File_name_unicode)
Unicode_strlcpy(context->File_name_unicode, Selector_filename_unicode, MAX_PATH_CHARACTERS);
strcpy(context->File_directory, Selector->Directory);
context->File_name = strdup(Selector_filename);
context->File_name_unicode = Unicode_strdup(Selector_filename_unicode);
free(context->File_directory);
context->File_directory = strdup(Selector->Directory);
if (!load)
context->Format = Selector->Format_filter;
}

View File

@ -321,26 +321,52 @@ char * Filepath_append_to_dir(const char * dir, const char * filename)
}
// Récupère la partie "nom de file seul" d'un chemin
void Extract_filename(char *dest, const char *source)
char * Extract_filename(char *dest, const char *source)
{
const char * position = Find_last_separator(source);
if (dest != NULL)
{
if (position)
strcpy(dest,position+1);
else
strcpy(dest,source);
return dest;
}
// Récupère la partie "répertoire+/" d'un chemin.
void Extract_path(char *dest, const char *source)
{
char * position=NULL;
Realpath(source,dest);
position = Find_last_separator(dest);
if (position)
*(position+1) = '\0';
else
{
if (position)
return strdup(position + 1);
else
return strdup(source);
}
}
// Récupère la partie "répertoire+/" d'un chemin.
char * Extract_path(char *dest, const char *source)
{
char * position;
char * path;
path = Realpath(source, dest);
position = Find_last_separator(path);
if (position)
position[1] = '\0';
else
{
if (dest != NULL)
strcat(dest, PATH_SEPARATOR);
else
{
char * tmp = realloc(path, strlen(path) + strlen(PATH_SEPARATOR) + 1);
if (tmp != NULL)
{
path = tmp;
strcat(path, PATH_SEPARATOR);
}
}
}
return path;
}
///
@ -899,9 +925,10 @@ void Release_lock_file(const char *file_directory)
lock_filename = Filepath_append_to_dir(file_directory, GFX2_LOCK_FILENAME);
#endif
Remove_path(lock_filename);
free(lock_filename);
}
char * Get_current_directory(char * buf, word * buf_unicode, size_t size)
char * Get_current_directory(char * buf, word * * unicode, size_t size)
{
#if defined(__MINT__)
if (buf == NULL)
@ -912,8 +939,8 @@ char * Get_current_directory(char * buf, word * buf_unicode, size_t size)
Dgetpath(buf+3,0);
strcat(buf,PATH_SEPARATOR);
if (buf_unicode != NULL)
buf_unicode[0] = 0; // no unicode support
if (unicode != NULL)
*unicode = NULL; // no unicode support
return buf;
#elif defined(WIN32)
@ -948,25 +975,29 @@ char * Get_current_directory(char * buf, word * buf_unicode, size_t size)
if (ret == NULL)
GFX2_Log(GFX2_ERROR, "getcwd(%p, %lu) failed !\n", buf, (unsigned long)size);
#ifdef ENABLE_FILENAMES_ICONV
if (ret != NULL && buf_unicode != NULL)
if (ret != NULL && unicode != NULL)
{
char * input = buf;
size_t inbytesleft = strlen(buf);
char * input = ret;
size_t inbytesleft = strlen(ret);
word * buf_unicode = malloc((inbytesleft + 1) * 2);
char * output = (char *)buf_unicode;
size_t outbytesleft = 2 * (size - 1);
if (cd_utf16 != (iconv_t)-1)
size_t outbytesleft = 2 * inbytesleft;
if (cd_utf16 != (iconv_t)-1 && buf_unicode != NULL)
{
size_t r = iconv(cd_utf16, &input, &inbytesleft, &output, &outbytesleft);
if (r != (size_t)-1)
{
output[0] = '\0';
output[1] = '\0';
*unicode = buf_unicode;
}
else
free(buf_unicode);
}
}
#else
if (buf_unicode != NULL)
buf_unicode[0] = 0; // no unicode support
if (unicode != NULL)
*unicode = NULL; // no unicode support
#endif
return ret;
#endif

View File

@ -93,9 +93,9 @@ unsigned long File_length_file(FILE * file);
/// Construct full file path
char * Filepath_append_to_dir(const char * dir, const char * filename);
/// Extracts the filename part from a full file name.
void Extract_filename(char *dest, const char *source);
char * Extract_filename(char *dest, const char *source);
/// Extracts the directory from a full file name.
void Extract_path(char *dest, const char *source);
char * Extract_path(char *dest, const char *source);
/// Finds the rightmost path separator in a full filename. Used to separate directory from file.
char * Find_last_separator(const char * str);
@ -180,10 +180,10 @@ void Release_lock_file(const char *file_directory);
///
/// Return the current directory, equivalent to getcwd()
/// @param buf destination buffer. can be NULL
/// @param buf_unicode destination buffer for the unicode version of the path
/// @param unicode destination pointer for the unicode version of the path
/// @param size destination buffer size, ignored if buf is NULL
/// @return NULL for error, buf or a malloc'ed buffer
char * Get_current_directory(char * buf, word * buf_unicode, size_t size);
char * Get_current_directory(char * buf, word ** unicode, size_t size);
///
/// Change current directory. return 0 for success, -1 in case of error

View File

@ -823,21 +823,22 @@ void Load_image(T_IO_Context *context)
// Transfer the data to main image.
if (!format->Palette_only)
{
free(Main.backups->Pages->Filename);
free(Main.backups->Pages->File_directory);
free(Main.backups->Pages->Filename_unicode);
Main.backups->Pages->Filename_unicode = NULL;
if (context->Original_file_name && context->Original_file_name[0]
&& context->Original_file_directory && context->Original_file_directory[0])
{
strcpy(Main.backups->Pages->Filename,context->Original_file_name);
strcpy(Main.backups->Pages->File_directory,context->Original_file_directory);
Main.backups->Pages->Filename_unicode[0] = 0;
Main.backups->Pages->Filename = strdup(context->Original_file_name); /// @todo steal buffer !
Main.backups->Pages->File_directory = strdup(context->Original_file_directory);
}
else
{
strcpy(Main.backups->Pages->Filename,context->File_name);
strcpy(Main.backups->Pages->File_directory,context->File_directory);
Main.backups->Pages->Filename = strdup(context->File_name);
Main.backups->Pages->File_directory = strdup(context->File_directory);
if (context->File_name_unicode)
Unicode_strlcpy(Main.backups->Pages->Filename_unicode, context->File_name_unicode, MAX_PATH_CHARACTERS);
else
Main.backups->Pages->Filename_unicode[0] = 0;
Main.backups->Pages->Filename_unicode = Unicode_strdup(context->File_name_unicode);
}
// On considère que l'image chargée n'est plus modifiée
@ -1732,6 +1733,9 @@ void Destroy_context(T_IO_Context *context)
free(context->Buffer_image_24b);
free(context->Buffer_image);
free(context->Preview_bitmap);
free(context->File_name);
free(context->File_name_unicode);
free(context->File_directory);
memset(context, 0, sizeof(T_IO_Context));
}
@ -1741,8 +1745,8 @@ void Init_context_preview(T_IO_Context * context, char *file_name, char *file_di
memset(context, 0, sizeof(T_IO_Context));
context->Type = CONTEXT_PREVIEW;
context->File_name = file_name;
context->File_directory = file_directory;
context->File_name = file_name != NULL ? strdup(file_name) : NULL;
context->File_directory = file_directory != NULL ? strdup(file_directory) : NULL;
}
// Setup for loading/saving an intermediate backup
@ -1759,8 +1763,8 @@ void Init_context_layered_image(T_IO_Context * context, char *file_name, char *f
memset(context, 0, sizeof(T_IO_Context));
context->Type = CONTEXT_MAIN_IMAGE;
context->File_name = file_name;
context->File_directory = file_directory;
context->File_name = file_name != NULL ? strdup(file_name) : NULL;
context->File_directory = file_directory != NULL ? strdup(file_directory) : NULL;
context->Format = Main.fileformat;
memcpy(context->Palette, Main.palette, sizeof(T_Palette));
context->Width = Main.image_width;
@ -1799,8 +1803,8 @@ void Init_context_brush(T_IO_Context * context, char *file_name, char *file_dire
memset(context, 0, sizeof(T_IO_Context));
context->Type = CONTEXT_BRUSH;
context->File_name = file_name;
context->File_directory = file_directory;
context->File_name = file_name != NULL ? strdup(file_name) : NULL;
context->File_directory = file_directory != NULL ? strdup(file_directory) : NULL;
context->Format = Brush_fileformat;
// Use main screen's palette
memcpy(context->Palette, Main.palette, sizeof(T_Palette));
@ -1821,8 +1825,8 @@ void Init_context_surface(T_IO_Context * context, char *file_name, char *file_di
memset(context, 0, sizeof(T_IO_Context));
context->Type = CONTEXT_SURFACE;
context->File_name = file_name;
context->File_directory = file_directory;
context->File_name = file_name != NULL ? strdup(file_name) : NULL;
context->File_directory = file_directory != NULL ? strdup(file_directory) : NULL;
context->Format = DEFAULT_FILEFORMAT;
// context->Palette
// context->Width

View File

@ -123,9 +123,11 @@
#include "brush.h"
#include "palette.h"
#include "realpath.h"
#include "unicode.h"
#include "input.h"
#include "help.h"
#include "filesel.h"
#include "factory.h"
#if defined(WIN32) && !(defined(USE_SDL) || defined(USE_SDL2))
#include "win32screen.h"
#endif
@ -619,7 +621,6 @@ int Init_program(int argc,char * argv[])
T_Gradient_array initial_gradients;
char * filenames[2] = {NULL, NULL};
char * directories[2] = {NULL, NULL};
word * filename_unicode;
#if defined(__MINT__)
printf("===============================\n");
@ -658,7 +659,7 @@ int Init_program(int argc,char * argv[])
// Choose directory for settings (read/write)
Config_directory = Get_config_directory(program_directory);
// Get current directory
Get_current_directory(Main.selector.Directory,Main.selector.Directory_unicode,MAX_PATH_CHARACTERS);
Main.selector.Directory = Get_current_directory(NULL, &Main.selector.Directory_unicode, 0);
free(program_directory);
@ -666,18 +667,21 @@ int Init_program(int argc,char * argv[])
Initial_directory = strdup(Main.selector.Directory);
// On initialise les données sur le nom de fichier de l'image de brouillon:
strcpy(Spare.selector.Directory,Main.selector.Directory);
Spare.selector.Directory = strdup(Main.selector.Directory);
Spare.selector.Directory_unicode = Unicode_strdup(Main.selector.Directory_unicode);
Main.fileformat = DEFAULT_FILEFORMAT;
Spare.fileformat = DEFAULT_FILEFORMAT;
strcpy(Brush_selector.Directory, Main.selector.Directory);
Brush_selector.Directory = strdup(Main.selector.Directory);
Brush_selector.Directory_unicode = Unicode_strdup(Main.selector.Directory_unicode);
Brush_file_directory = strdup(Main.selector.Directory);
Brush_filename = strdup("NO_NAME.GIF");
Brush_filename_unicode = NULL;
Brush_fileformat = DEFAULT_FILEFORMAT;
strcpy(Palette_selector.Directory,Main.selector.Directory);
Palette_selector.Directory = strdup(Main.selector.Directory);
Palette_selector.Directory_unicode = Unicode_strdup(Main.selector.Directory_unicode);
// On initialise ce qu'il faut pour que les fileselects ne plantent pas:
@ -1134,11 +1138,9 @@ int Init_program(int argc,char * argv[])
case 2:
// Load this file
Init_context_layered_image(&context, filenames[1], directories[1]);
filename_unicode = Get_Unicode_Filename(NULL, filenames[1], directories[1]);
context.File_name_unicode = filename_unicode;
context.File_name_unicode = Get_Unicode_Filename(NULL, filenames[1], directories[1]);
Load_image(&context);
Destroy_context(&context);
free(filename_unicode);
Redraw_layered_image();
End_of_modification();
@ -1149,11 +1151,9 @@ int Init_program(int argc,char * argv[])
#endif
case 1:
Init_context_layered_image(&context, filenames[0], directories[0]);
filename_unicode = Get_Unicode_Filename(NULL, filenames[0], directories[0]);
context.File_name_unicode = filename_unicode;
context.File_name_unicode = Get_Unicode_Filename(NULL, filenames[0], directories[0]);
Load_image(&context);
Destroy_context(&context);
free(filename_unicode);
Redraw_layered_image();
End_of_modification();
@ -1291,6 +1291,15 @@ void Program_shutdown(void)
FREE_POINTER(Config_directory);
FREE_POINTER(Data_directory);
FREE_POINTER(Main.selector.Directory);
FREE_POINTER(Main.selector.Directory_unicode);
FREE_POINTER(Spare.selector.Directory);
FREE_POINTER(Spare.selector.Directory_unicode);
FREE_POINTER(Brush_selector.Directory);
FREE_POINTER(Brush_selector.Directory_unicode);
FREE_POINTER(Palette_selector.Directory);
FREE_POINTER(Palette_selector.Directory_unicode);
// Free Config
FREE_POINTER(Config.Skin_file);
FREE_POINTER(Config.Font_file);
@ -1300,6 +1309,11 @@ void Program_shutdown(void)
}
FREE_POINTER(Config.Scripts_directory);
for (i = 0; i < 10; i++)
{
FREE_POINTER(Bound_script[i]);
}
Uninit_text();
#ifdef ENABLE_FILENAMES_ICONV

View File

@ -36,6 +36,7 @@
#include "tiles.h"
#include "graph.h"
#include "layers.h"
#include "unicode.h"
// -- Layers data
@ -76,9 +77,9 @@ T_Page * New_page(int nb_layers)
page->Image_mode = IMAGE_MODE_LAYERED;
memset(page->Palette, 0, sizeof(T_Palette));
page->Comment[0] = '\0';
page->File_directory[0]='\0';
page->Filename[0]='\0';
page->Filename_unicode[0]=0;
page->File_directory = NULL;
page->Filename = NULL;
page->Filename_unicode = NULL;
page->File_format = DEFAULT_FILEFORMAT;
page->Nb_layers = nb_layers;
page->Gradients = NULL;
@ -457,7 +458,13 @@ void Clear_page(T_Page * page)
void Copy_S_page(T_Page * dest, T_Page * source)
{
*dest = *source;
dest->Gradients=NULL;
dest->Gradients = Dup_gradient(source);
if (source->File_directory != NULL)
dest->File_directory = strdup(source->File_directory);
if (source->Filename != NULL)
dest->Filename = strdup(source->Filename);
if (source->Filename_unicode != NULL)
dest->Filename_unicode = Unicode_strdup(source->Filename_unicode);
}
@ -592,6 +599,9 @@ void Free_last_page_of_list(T_List_of_pages * list)
page->Next->Prev = page->Prev;
page->Prev->Next = page->Next;
Clear_page(page);
free(page->File_directory);
free(page->Filename);
free(page->Filename_unicode);
free(page);
page = NULL;
list->List_size--;
@ -775,9 +785,9 @@ int Init_all_backup_lists(enum IMAGE_MODES image_mode, int width, int height)
// On y met les infos sur la dimension de démarrage
Main.backups->Pages->Width = width;
Main.backups->Pages->Height = height;
strcpy(Main.backups->Pages->File_directory,Main.selector.Directory);
strcpy(Main.backups->Pages->Filename,"NO_NAME.GIF");
Main.backups->Pages->Filename_unicode[0] = 0;
Main.backups->Pages->File_directory = strdup(Main.selector.Directory);
Main.backups->Pages->Filename = strdup("NO_NAME.GIF");
Main.backups->Pages->Filename_unicode = NULL;
for (i=0; i<Main.backups->Pages->Nb_layers; i++)
@ -821,9 +831,9 @@ int Init_all_backup_lists(enum IMAGE_MODES image_mode, int width, int height)
Spare.backups->Pages->Height = height;
memcpy(Spare.backups->Pages->Palette,Main.palette,sizeof(T_Palette));
strcpy(Spare.backups->Pages->Comment,"");
strcpy(Spare.backups->Pages->File_directory,Main.selector.Directory);
strcpy(Spare.backups->Pages->Filename,"NO_NAME2.GIF");
Spare.backups->Pages->Filename_unicode[0] = 0;
Spare.backups->Pages->File_directory = strdup(Main.selector.Directory);
Spare.backups->Pages->Filename = strdup("NO_NAME2.GIF");
Spare.backups->Pages->Filename_unicode = NULL;
Spare.backups->Pages->File_format=DEFAULT_FILEFORMAT;
// Copy this informations in the global Spare_ variables
@ -916,8 +926,9 @@ int Backup_with_new_dimensions(int width,int height)
memcpy(Main.backups->Pages->Palette, Main.backups->Pages->Next->Palette, sizeof(T_Palette));
strcpy(Main.backups->Pages->Comment ,Main.backups->Pages->Next->Comment);
Main.backups->Pages->File_format = Main.backups->Pages->Next->File_format;
strcpy(Main.backups->Pages->Filename, Main.backups->Pages->Next->Filename);
strcpy(Main.backups->Pages->File_directory, Main.backups->Pages->Next->File_directory);
Main.backups->Pages->Filename = strdup(Main.backups->Pages->Next->Filename);
Main.backups->Pages->Filename_unicode = Unicode_strdup(Main.backups->Pages->Next->Filename_unicode);
Main.backups->Pages->File_directory = strdup(Main.backups->Pages->Next->File_directory);
Main.backups->Pages->Gradients = Dup_gradient(Main.backups->Pages->Next);
Main.backups->Pages->Background_transparent = Main.backups->Pages->Next->Background_transparent;
Main.backups->Pages->Transparent_color = Main.backups->Pages->Next->Transparent_color;
@ -1052,7 +1063,6 @@ int Backup_and_resize_the_spare(int width,int height)
// Fill it with a copy of the latest history
Copy_S_page(new_page,Spare.backups->Pages);
new_page->Gradients=Dup_gradient(Spare.backups->Pages);
new_page->Width=width;
new_page->Height=height;
@ -1108,7 +1118,6 @@ void Backup_layers(int layer)
// Fill it with a copy of the latest history
Copy_S_page(new_page,Main.backups->Pages);
new_page->Gradients=Dup_gradient(Main.backups->Pages);
Create_new_page(new_page,Main.backups,layer);
Download_infos_page_main(new_page);
@ -1168,7 +1177,6 @@ void Backup_the_spare(int layer)
// Fill it with a copy of the latest history
Copy_S_page(new_page,Spare.backups->Pages);
new_page->Gradients=Dup_gradient(Spare.backups->Pages);
Create_new_page(new_page,Spare.backups,layer);
// Copy the actual pixels from the backup to the latest page

View File

@ -64,13 +64,6 @@ int Dup_layer_if_shared(T_Page * page, int layer);
void Upload_infos_page(T_Document * doc);
// private
T_Page * New_page(int nb_layers);
void Download_infos_page_spare(T_Page * page);
void Clear_page(T_Page * page);
void Copy_S_page(T_Page * dest,T_Page * source);
///
/// LISTS OF PAGES

View File

@ -116,20 +116,17 @@ char * Get_program_directory(const char * argv0)
char path[PATH_MAX];
if (readlink("/proc/self/exe", path, sizeof(path)) >= 0)
{
program_dir = malloc(strlen(path) + 1);
Extract_path(program_dir, path);
program_dir = Extract_path(NULL, path);
return program_dir;
}
}
program_dir = malloc(strlen(argv0) + 1);
Extract_path(program_dir, argv0);
program_dir = Extract_path(NULL, argv0);
// Others: The part of argv[0] before the executable name.
// Keep the last \ or /.
// On Windows, Mingw32 already provides the full path in all cases.
#else
program_dir = malloc(strlen(argv0) + 1);
Extract_path(program_dir, argv0);
program_dir = Extract_path(NULL, argv0);
#endif
return program_dir;
}

View File

@ -413,10 +413,10 @@ typedef struct T_Page
char Comment[COMMENT_SIZE+1]; ///< Comment to store in the image file.
char File_directory[MAX_PATH_CHARACTERS];///< Directory that contains the file.
char Filename[MAX_PATH_CHARACTERS]; ///< Filename without directory.
word Filename_unicode[MAX_PATH_CHARACTERS]; ///< Filename without directory.
byte File_format; ///< File format, in enum ::FILE_FORMATS
char * File_directory; ///< Directory that contains the file.
char * Filename; ///< Filename without directory.
word * Filename_unicode; ///< Filename without directory.
enum FILE_FORMATS File_format; ///< File format, in enum ::FILE_FORMATS
struct T_Page *Next; ///< Pointer to the next backup
struct T_Page *Prev; ///< Pointer to the previous backup
T_Gradient_array *Gradients; ///< Pointer to the gradients used by the image.
@ -555,8 +555,8 @@ typedef struct T_Selector_settings
byte Format_filter; ///< 0 for "*.*", or a value of enum ::FILE_FORMATS
short Position; ///< Index of the first file/entry to display in list
short Offset; ///< Position of the "highlight" bar in the file list
char Directory[MAX_PATH_CHARACTERS]; ///< Directory currently browsed
word Directory_unicode[MAX_PATH_CHARACTERS]; ///< Directory currently browsed
char * Directory; ///< Directory currently browsed
word * Directory_unicode; ///< Directory currently browsed
} T_Selector_settings;
/// structure for Main or Spare page global data

View File

@ -40,6 +40,8 @@ word * Unicode_strdup(const word * str)
size_t byte_size;
word * new_str;
if (str == NULL)
return NULL;
byte_size = Unicode_strlen(str) * 2 + 2;
new_str = malloc(byte_size);
if (new_str != NULL)

View File

@ -1103,7 +1103,7 @@ void Print_filename(void)
Menu_status_Y,Menu_factor_X*max_size*8,Menu_factor_Y<<3,MC_Light);
// Partial copy of the name
if (Main.backups->Pages->Filename_unicode[0] != 0)
if (Main.backups->Pages->Filename_unicode != NULL)
Unicode_strlcpy(display_string, Main.backups->Pages->Filename_unicode, 256);
else
{
@ -1124,7 +1124,7 @@ void Print_filename(void)
if (string_size > max_size)
{
// check if the begining of the Spare file name is the same
if (Spare.backups->Pages->Filename_unicode[0] != 0
if (Spare.backups->Pages->Filename_unicode != NULL
&& 0 == memcmp(display_string, Spare.backups->Pages->Filename_unicode, (max_size - 1) * sizeof(word)))
{
// display : "...end_of_filename.ext"