Advertisement
Guest User

Untitled

a guest
Sep 24th, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.43 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <dirent.h>
  4. #include <unistd.h>
  5. #include <nds.h>
  6. #include <nf_lib.h>
  7.  
  8. #include "sd_completa.h"
  9.  
  10. //Funcion comprobar si es un .nds o no
  11. int C_extension(const char* nombre){
  12.      //Declaramos variables
  13.      u8 valido = 0;
  14.      u8 longitud = 0;
  15.      u8 i = 0, j = 0;
  16.      
  17.      //Obtenemos la longitud del array
  18.      longitud = strlen(nombre);
  19.                        
  20.      char extension_nds[5];
  21.      char extension_save_wood[9];
  22.      char extension_save[5];
  23.                        
  24.      j = 0;
  25.      for(i = (longitud-4); i < longitud; i++){
  26.      extension_nds[j] = nombre[i];
  27.      j++;
  28.      }
  29.      extension_nds[4] = '\0';
  30.  
  31.      j = 0;
  32.      for(i = (longitud-8); i < longitud; i++){
  33.      extension_save_wood[j] = nombre[i];
  34.      j++;
  35.      }
  36.      extension_save_wood[8] = '\0';
  37.                        
  38.      j = 0;
  39.      for(i = (longitud-4); i < longitud; i++){
  40.      extension_save[j] = nombre[i];
  41.      j++;
  42.      }
  43.      extension_save[4] = '\0';
  44.                        
  45.      //Comprobamos (1 = archivo, 2 = SD, 3 = save)
  46.      if(strcmp(extension_nds,".nds") == 0) valido = 1;
  47.      else if(strcmp(extension_nds,".NDS") == 0) valido = 1;                                  
  48.      else if(strcmp(extension_save_wood,".nds.sav") == 0) valido = 3;
  49.      else if(strcmp(extension_save_wood,".NDS.SAV") == 0) valido = 3;
  50.      else if(strcmp(extension_save,".sav") == 0) valido = 3;
  51.      else if(strcmp(extension_save,".SAV") == 0) valido = 3;
  52.      else if(strcmp(nombre,"fat:/") == 0) valido = 2;
  53.      else valido = 0;                            
  54.  
  55.      //Si no es un .sav ni un .nds ni es el root, tiene que ser una carpeta (valido = 0)
  56.      
  57.      //!!!!
  58.      //La parte del save no se usa, pero es bueno tenerlo en cuenta, nunca se sabe.
  59.      
  60.      return valido;
  61. }
  62.  
  63. //Para trimmear la SD completa sirve esta misma funcion solo que como "carpeta" usamos ("."), como en chdir(".");
  64. void Dir_struct_rom(const char* carpeta, char **buffer_rom, u8 var_rom, bool ruta){
  65.      DIR *directorio;
  66.      struct dirent *infodir;
  67.      u8 valido = 0;
  68.      u8 i = 0;
  69.      char ruta_rom[MAXPATHLEN * 2];
  70.      
  71.      i = var_rom;
  72.      
  73.      //Abrimos la carpeta
  74.      directorio = opendir(carpeta);
  75.      
  76.      if(directorio == NULL)
  77.      {
  78.                    NF_WriteText(0,0,7,21,"ERROR");
  79.                    for(;;){
  80.                            swiWaitForVBlank();
  81.                            }
  82.      }
  83.      
  84.      while((infodir = readdir(directorio)) != NULL )
  85.      {                              
  86.                    valido = C_extension(infodir->d_name);
  87.                    switch(valido){
  88.                                  case 0:
  89.                                       break;
  90.                                  case 1:
  91.                                       if(ruta == true){
  92.                                               chdir(carpeta);
  93.                                               getcwd(ruta_rom,MAXPATHLEN*2);
  94.                                               chdir("..");
  95.                                               sprintf(ruta_rom,"%s%s", ruta_rom,infodir->d_name);
  96.                                               strcpy(buffer_rom[i++], ruta_rom);
  97.                                               swiWaitForVBlank();
  98.                                       }else{
  99.                                               strcpy(buffer_rom[i++], infodir->d_name);
  100.                                               swiWaitForVBlank();
  101.                                       }
  102.                                       break;
  103.                    }
  104.              
  105.      }
  106.  
  107.      closedir(directorio);
  108. }
  109.  
  110. int Numero_Roms(const char* carpeta, u8 modo){
  111.      DIR *directorio;
  112.      struct dirent *infodir;
  113.      u8 valido = 0;
  114.      u16 rom = 0;
  115.      u16 carp = 0;
  116.      u16 result = 0;
  117.      
  118.      //Abrimos la carpeta
  119.      directorio = opendir(carpeta);
  120.  
  121.      while((infodir = readdir(directorio)) != NULL )
  122.      {                              
  123.                    valido = C_extension(infodir->d_name);
  124.                    switch(valido){
  125.                                   case 0:
  126.                                        if((strcmp(infodir->d_name,".") != 0) && (strcmp(infodir->d_name,"..") != 0) && (infodir->d_type == 4)){
  127.                                                                       carp++;
  128.                                        }
  129.                                        swiWaitForVBlank();
  130.                                        break;
  131.                                   case 1:
  132.                                        rom++;
  133.                                        swiWaitForVBlank();
  134.                                        break;
  135.                                        
  136.                    }
  137.              
  138.      }
  139.      closedir(directorio);
  140.      
  141.      //Con esto (de esta forma) evitamos un warning
  142.      switch(modo){
  143.                   case 0:
  144.                        result = rom;
  145.                        break;
  146.                  
  147.                   case 1:
  148.                        result = carp;  
  149.                        break;
  150.                   }
  151.                  
  152.      return result;
  153. }
  154.  
  155. //Aprovechamos la funcion para devolver el numero de carpetas totales
  156. int Listar_Carpetas(char **buffer_carpeta, const char* root){
  157.     DIR *directorio;
  158.     struct dirent *carpeta_dir;
  159.     char ruta_base[MAXPATHLEN * 2];
  160.     char ruta_carpeta[MAXPATHLEN * 2];
  161.     u16 columna = 0;
  162.     u16 num_all_carpetas = 1; //Por el root (nitro:/ o fat:/)
  163.    
  164.     directorio = opendir(root);
  165.      
  166.     while((carpeta_dir = readdir(directorio)) != NULL )
  167.     {
  168.                        if((strcmp(carpeta_dir->d_name,".") != 0) && (strcmp(carpeta_dir->d_name,"..") != 0) && (carpeta_dir->d_type == 4)){
  169.                                                            //Obtenemos ruta original
  170.                                                            getcwd(ruta_base,MAXPATHLEN);
  171.                                                            //Añadimos la carpeta en la que nos encontramos
  172.                                                            sprintf(ruta_carpeta,"%s%s",ruta_base,carpeta_dir->d_name);
  173.                                                            //Copiamos la carpeta al buffer
  174.                                                            strcpy(buffer_carpeta[columna++], ruta_carpeta);
  175.                                                            //Sumamos una carpeta
  176.                                                            num_all_carpetas++;
  177.                                                            //Debug
  178.                                                            //NF_WriteTextVAR(0,0,1,columna,"%d %s",num_all_carpetas,buffer_carpeta[columna - 1]);
  179.                                                            //Micro Pausa (refresco)
  180.                                                            swiWaitForVBlank();
  181.                        }
  182.                                                            
  183.     }
  184.    
  185.     closedir(directorio);
  186.  
  187.    
  188.     //Con eso obtenemos las carpetas de root, ahora tocan las subfolder
  189.     for(u16 carp = 0; carp < num_all_carpetas; carp++){
  190.             directorio = opendir(buffer_carpeta[carp]);
  191.             while((carpeta_dir = readdir(directorio)) != NULL )
  192.             {
  193.                        if((strcmp(carpeta_dir->d_name,".") != 0) && (strcmp(carpeta_dir->d_name,"..") != 0) && (carpeta_dir->d_type == 4)){
  194.                                                            //Añadimos la carpeta en la que nos encontramos
  195.                                                            sprintf(ruta_carpeta,"%s/%s",buffer_carpeta[carp],carpeta_dir->d_name);
  196.                                                            //Copiamos la carpeta al buffer
  197.                                                            strcpy(buffer_carpeta[columna++], ruta_carpeta);
  198.                                                            //Sumamos una carpeta al loop
  199.                                                            num_all_carpetas++;
  200.                                                            //Debug
  201.                                                            //NF_WriteTextVAR(1,0,0,columna,"%d %s",carp + 1/*num_all_carpetas*/,buffer_carpeta[columna - 1]);
  202.                                                            //Volvemos al dir anterior
  203.                                                            chdir("..");
  204.                                                            //Micro Pausa (refresco)
  205.                                                            swiWaitForVBlank();
  206.                                  }
  207.             }
  208.             closedir(directorio);
  209.     }
  210.    
  211.     NF_WriteTextVAR(1,0,1,1,"Total: %d",num_all_carpetas);
  212.     NF_UpdateTextLayers();
  213.    
  214.     return num_all_carpetas;
  215. }
  216.  
  217. int Listar_Roms(char **buffer_roms, char **buffer_carpeta, u16 num_carp, const char* root){
  218.     u16 roms = 0;
  219.    
  220.     //Obtenemos primero el root
  221.     Dir_struct_rom(root,buffer_roms,0,true);
  222.     roms += Numero_Roms(root, 0);
  223.    
  224.     for(int var = 0; var < num_carp; var++){
  225.                        
  226.             Dir_struct_rom(buffer_carpeta[var],buffer_roms,roms,true);
  227.            
  228.             roms += Numero_Roms(buffer_carpeta[var], 0);
  229.            
  230.             NF_WriteTextVAR(0,0,1,var + 1, "%s", buffer_carpeta[var]);
  231.             NF_WriteTextVAR(1,0,1,var + 1, "%s", buffer_roms[var]);
  232.             NF_UpdateTextLayers();
  233.             swiWaitForVBlank();
  234.            
  235.             }
  236.            
  237.     return roms;
  238. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement