

#include "allegro5/allegro.h"

#include <cstdio>
#include <string>


int main(int argc , char** argv) {
   
   char* read_dir = 0;
   bool free_dir = false;
   bool close_dir = false;
   
   
   if (!al_init()) {return 1;}
   
   if (argc == 2) {
      // Use first argument as read directory
      read_dir = argv[1];
   }
   else {
      // Use current directory as read directory
      read_dir = al_get_current_directory();
      free_dir = true;
   }
   
   ALLEGRO_FS_ENTRY* fs_dir_entry = al_create_fs_entry(read_dir);
   
   
   unsigned int mode = al_get_fs_entry_mode(fs_dir_entry);
   
   if (!(mode & ALLEGRO_FILEMODE_ISDIR)) {
      printf("Invalid directory! (%s)\n" , read_dir);
      al_destroy_fs_entry(fs_dir_entry);
      return -1;
   }
   
   if (!al_open_directory(fs_dir_entry)) {
      printf("Could not open directory %s\n" , read_dir);
   }
   else {
      /// Directory is now open
      close_dir = true;
      
      printf("Contents of directory %s\n" , read_dir);
      
      // prime the while loop
      ALLEGRO_FS_ENTRY* fs_entry = al_read_directory(fs_dir_entry);
   
      // Loop until there are not more entries
      while(fs_entry) {
         
         // String manip to get short name of file/dir
         std::string s = al_get_fs_entry_name(fs_entry);
         std::string s2;
         char path_sep = '\\';
         if (s.find_first_of('/') != std::string::npos) {
            path_sep = '/';
         }
         unsigned int last_separator = s.find_last_of(path_sep);
         if (last_separator == std::string::npos) {
            s2 = s;
         }
         else {
            s2 = s.substr(s.find_last_of(path_sep) + 1);
         }
      
         // output short file/dir name
         printf("%s\n" , s2.c_str());
         
         al_destroy_fs_entry(fs_entry);
         
         fs_entry = al_read_directory(fs_dir_entry);
      }
   }

   
   if (close_dir) {
      al_close_directory(fs_dir_entry);
   }
   
   if (fs_dir_entry) {
      al_destroy_fs_entry(fs_dir_entry);
      fs_dir_entry = 0;
   }
   
   if (free_dir) {
      al_free(read_dir);
      read_dir = 0;
   }
   return 0;
}


