REVIEWED: Possible memory leak #202
This commit is contained in:
parent
1f920bf264
commit
2f127b3e83
@ -157,7 +157,9 @@ FileInfo *dirFilesIcon = NULL;
|
||||
// Internal Module Functions Definition
|
||||
//----------------------------------------------------------------------------------
|
||||
// Read all filenames from directory (supported file types)
|
||||
static char **ReadDirectoryFiles(const char *dir, int *filesCount, char *filterExt);
|
||||
static char **LoadDirectoryFiles(const char *dir, int *filesCount, char *filterExt);
|
||||
// Read files in new path
|
||||
static void ReloadDirectoryFiles(GuiFileDialogState *state);
|
||||
|
||||
#if defined(USE_CUSTOM_LISTVIEW_FILEINFO)
|
||||
// List View control for files info with extended parameters
|
||||
@ -215,16 +217,6 @@ GuiFileDialogState InitGuiFileDialog(int width, int height, const char *initPath
|
||||
return state;
|
||||
}
|
||||
|
||||
// Read files in new path
|
||||
static void FD_RELOAD_DIRPATH(GuiFileDialogState *state)
|
||||
{
|
||||
for (int i = 0; i < state->dirFilesCount; i++) RL_FREE(state->dirFiles[i]);
|
||||
RL_FREE(state->dirFiles);
|
||||
|
||||
state->dirFiles = ReadDirectoryFiles(state->dirPathText, &state->dirFilesCount, state->filterExt);
|
||||
state->itemFocused = 0;
|
||||
}
|
||||
|
||||
// Update and draw file dialog
|
||||
void GuiFileDialog(GuiFileDialogState *state)
|
||||
{
|
||||
@ -238,13 +230,13 @@ void GuiFileDialog(GuiFileDialogState *state)
|
||||
//------------------------------------------------------------------------------------
|
||||
if (dirFilesIcon == NULL)
|
||||
{
|
||||
dirFilesIcon = (FileInfo *)RL_MALLOC(MAX_DIRECTORY_FILES*sizeof(FileInfo)); // Max files to read
|
||||
for (int i = 0; i < MAX_DIRECTORY_FILES; i++) dirFilesIcon[i] = (char *)calloc(MAX_DIR_PATH_LENGTH, 1); // Max file name length
|
||||
dirFilesIcon = (FileInfo *)RL_CALLOC(MAX_DIRECTORY_FILES, sizeof(FileInfo)); // Max files to read
|
||||
for (int i = 0; i < MAX_DIRECTORY_FILES; i++) dirFilesIcon[i] = (char *)RL_CALLOC(MAX_DIR_PATH_LENGTH, 1); // Max file name length
|
||||
}
|
||||
|
||||
if (state->dirFiles == NULL)
|
||||
{
|
||||
state->dirFiles = ReadDirectoryFiles(state->dirPathText, &state->dirFilesCount, state->filterExt);
|
||||
state->dirFiles = LoadDirectoryFiles(state->dirPathText, &state->dirFilesCount, state->filterExt);
|
||||
|
||||
for(int f = 0; f < state->dirFilesCount; f++)
|
||||
{
|
||||
@ -266,8 +258,8 @@ void GuiFileDialog(GuiFileDialogState *state)
|
||||
// Move dir path one level up
|
||||
strcpy(state->dirPathText, GetPrevDirectoryPath(state->dirPathText));
|
||||
|
||||
// RL_FREE previous dirFiles (reloaded by ReadDirectoryFiles())
|
||||
FD_RELOAD_DIRPATH(state);
|
||||
// Reload directory files (frees previous list)
|
||||
ReloadDirectoryFiles(state);
|
||||
|
||||
state->filesListActive = -1;
|
||||
strcpy(state->fileNameText, "\0");
|
||||
@ -281,8 +273,8 @@ void GuiFileDialog(GuiFileDialogState *state)
|
||||
// Verify if a valid path has been introduced
|
||||
if (DirectoryExists(state->dirPathText))
|
||||
{
|
||||
// RL_FREE previous dirFiles (reloaded by ReadDirectoryFiles())
|
||||
FD_RELOAD_DIRPATH(state);
|
||||
// Reload directory files (frees previous list)
|
||||
ReloadDirectoryFiles(state);
|
||||
|
||||
strcpy(state->dirPathTextCopy, state->dirPathText);
|
||||
}
|
||||
@ -319,8 +311,8 @@ void GuiFileDialog(GuiFileDialogState *state)
|
||||
|
||||
strcpy(state->dirPathTextCopy, state->dirPathText);
|
||||
|
||||
// RL_FREE previous dirFiles (reloaded by ReadDirectoryFiles())
|
||||
FD_RELOAD_DIRPATH(state);
|
||||
// Reload directory files (frees previous list)
|
||||
ReloadDirectoryFiles(state);
|
||||
|
||||
strcpy(state->dirPathTextCopy, state->dirPathText);
|
||||
|
||||
@ -381,8 +373,8 @@ void GuiFileDialog(GuiFileDialogState *state)
|
||||
// File dialog has been closed!
|
||||
if (!state->fileDialogActive)
|
||||
{
|
||||
// RL_FREE dirFiles memory
|
||||
for (int i = 0; i < state->dirFilesCount; i++)
|
||||
// Free dirFiles memory
|
||||
for (int i = 0; i < MAX_DIRECTORY_FILES; i++)
|
||||
{
|
||||
RL_FREE(state->dirFiles[i]);
|
||||
RL_FREE(dirFilesIcon[i]);
|
||||
@ -413,11 +405,11 @@ static inline int FileCompare(const char *d1, const char *d2, const char *dir)
|
||||
}
|
||||
|
||||
// Read all filenames from directory (supported file types)
|
||||
static char **ReadDirectoryFiles(const char *dir, int *filesCount, char *filterExt)
|
||||
static char **LoadDirectoryFiles(const char *dir, int *filesCount, char *filterExt)
|
||||
{
|
||||
int validFilesCount = 0;
|
||||
char **validFiles = (char **)RL_MALLOC(MAX_DIRECTORY_FILES*sizeof(char *)); // Max files to read
|
||||
for (int i = 0; i < MAX_DIRECTORY_FILES; i++) validFiles[i] = (char *)RL_MALLOC(MAX_DIR_PATH_LENGTH); // Max file name length
|
||||
char **validFiles = (char **)RL_CALLOC(MAX_DIRECTORY_FILES, sizeof(char *)); // Max files to read
|
||||
for (int i = 0; i < MAX_DIRECTORY_FILES; i++) validFiles[i] = (char *)RL_CALLOC(MAX_DIR_PATH_LENGTH, 1); // Max file name length
|
||||
|
||||
int filterExtCount = 0;
|
||||
const char **extensions = GuiTextSplit(filterExt, &filterExtCount, NULL);
|
||||
@ -506,6 +498,16 @@ static char **ReadDirectoryFiles(const char *dir, int *filesCount, char *filterE
|
||||
return validFiles;
|
||||
}
|
||||
|
||||
// Read files in new path
|
||||
static void ReloadDirectoryFiles(GuiFileDialogState *state)
|
||||
{
|
||||
for (int i = 0; i < MAX_DIRECTORY_FILES; i++) RL_FREE(state->dirFiles[i]);
|
||||
RL_FREE(state->dirFiles);
|
||||
|
||||
state->dirFiles = LoadDirectoryFiles(state->dirPathText, &state->dirFilesCount, state->filterExt);
|
||||
state->itemFocused = 0;
|
||||
}
|
||||
|
||||
#if defined(USE_CUSTOM_LISTVIEW_FILEINFO)
|
||||
// List View control for files info with extended parameters
|
||||
static int GuiListViewFiles(Rectangle bounds, FileInfo *files, int count, int *focus, int *scrollIndex, int active)
|
||||
|
Loading…
x
Reference in New Issue
Block a user