Browse Source

Fixed file/alloc limitation in GetDirectoryFiles() (#2126)

MAX_DIRECTORY_FILES macro removed.
ClearDirectoryFiles() tweaked to reflect changes.
lib-omar 3 years ago
parent
commit
91135c8799
1 changed files with 17 additions and 20 deletions
  1. 17 20
      src/rcore.c

+ 17 - 20
src/rcore.c

@@ -2894,41 +2894,38 @@ const char *GetWorkingDirectory(void)
     return path;
 }
 
-// Get filenames in a directory path (max 512 files)
+// Get filenames in a directory path
 // NOTE: Files count is returned by parameters pointer
 char **GetDirectoryFiles(const char *dirPath, int *fileCount)
 {
-    #define MAX_DIRECTORY_FILES     512
-
     ClearDirectoryFiles();
 
-    // Memory allocation for MAX_DIRECTORY_FILES
-    dirFilesPath = (char **)RL_MALLOC(MAX_DIRECTORY_FILES*sizeof(char *));
-    for (int i = 0; i < MAX_DIRECTORY_FILES; i++) dirFilesPath[i] = (char *)RL_MALLOC(MAX_FILEPATH_LENGTH*sizeof(char));
-
     int counter = 0;
     struct dirent *entity;
     DIR *dir = opendir(dirPath);
 
-    if (dir != NULL)  // It's a directory
+    if (dir != NULL) // It's a directory
     {
-        // TODO: Reading could be done in two passes,
-        // first one to count files and second one to read names
-        // That way we can allocate required memory, instead of a limited pool
+        // Count files
+        while ((entity = readdir(dir)) != NULL) counter++; 
 
-        while ((entity = readdir(dir)) != NULL)
-        {
-            strcpy(dirFilesPath[counter], entity->d_name);
-            counter++;
-        }
+        dirFileCount = counter;
+        *fileCount = dirFileCount;
+
+        // Memory allocation for dirFileCount
+        dirFilesPath = (char **)RL_MALLOC(dirFileCount*sizeof(char *));
+        for (int i = 0; i < dirFileCount; i++) dirFilesPath[i] = (char *)RL_MALLOC(MAX_FILEPATH_LENGTH*sizeof(char));
+        
+        // Reset our position in the directory to the beginning
+        rewinddir(dir);
+
+        // Read file names
+        for (int i = 0; (entity = readdir(dir)) != NULL; i++) strcpy(dirFilesPath[i], entity->d_name);
 
         closedir(dir);
     }
     else TRACELOG(LOG_WARNING, "FILEIO: Failed to open requested directory");  // Maybe it's a file...
 
-    dirFileCount = counter;
-    *fileCount = dirFileCount;
-
     return dirFilesPath;
 }
 
@@ -2937,7 +2934,7 @@ void ClearDirectoryFiles(void)
 {
     if (dirFileCount > 0)
     {
-        for (int i = 0; i < MAX_DIRECTORY_FILES; i++) RL_FREE(dirFilesPath[i]);
+        for (int i = 0; i < dirFileCount; i++) RL_FREE(dirFilesPath[i]);
 
         RL_FREE(dirFilesPath);
     }