Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <dirent.h>
- #include <unistd.h>
- #include <nds.h>
- #include <nf_lib.h>
- #include "sd_completa.h"
- //Funcion comprobar si es un .nds o no
- int C_extension(const char* nombre){
- //Declaramos variables
- u8 valido = 0;
- u8 longitud = 0;
- u8 i = 0, j = 0;
- //Obtenemos la longitud del array
- longitud = strlen(nombre);
- char extension_nds[5];
- char extension_save_wood[9];
- char extension_save[5];
- j = 0;
- for(i = (longitud-4); i < longitud; i++){
- extension_nds[j] = nombre[i];
- j++;
- }
- extension_nds[4] = '\0';
- j = 0;
- for(i = (longitud-8); i < longitud; i++){
- extension_save_wood[j] = nombre[i];
- j++;
- }
- extension_save_wood[8] = '\0';
- j = 0;
- for(i = (longitud-4); i < longitud; i++){
- extension_save[j] = nombre[i];
- j++;
- }
- extension_save[4] = '\0';
- //Comprobamos (1 = archivo, 2 = SD, 3 = save)
- if(strcmp(extension_nds,".nds") == 0) valido = 1;
- else if(strcmp(extension_nds,".NDS") == 0) valido = 1;
- else if(strcmp(extension_save_wood,".nds.sav") == 0) valido = 3;
- else if(strcmp(extension_save_wood,".NDS.SAV") == 0) valido = 3;
- else if(strcmp(extension_save,".sav") == 0) valido = 3;
- else if(strcmp(extension_save,".SAV") == 0) valido = 3;
- else if(strcmp(nombre,"fat:/") == 0) valido = 2;
- else valido = 0;
- //Si no es un .sav ni un .nds ni es el root, tiene que ser una carpeta (valido = 0)
- //!!!!
- //La parte del save no se usa, pero es bueno tenerlo en cuenta, nunca se sabe.
- return valido;
- }
- //Para trimmear la SD completa sirve esta misma funcion solo que como "carpeta" usamos ("."), como en chdir(".");
- void Dir_struct_rom(const char* carpeta, char **buffer_rom, u8 var_rom, bool ruta){
- DIR *directorio;
- struct dirent *infodir;
- u8 valido = 0;
- u8 i = 0;
- char ruta_rom[MAXPATHLEN * 2];
- i = var_rom;
- //Abrimos la carpeta
- directorio = opendir(carpeta);
- if(directorio == NULL)
- {
- NF_WriteText(0,0,7,21,"ERROR");
- for(;;){
- swiWaitForVBlank();
- }
- }
- while((infodir = readdir(directorio)) != NULL )
- {
- valido = C_extension(infodir->d_name);
- switch(valido){
- case 0:
- break;
- case 1:
- if(ruta == true){
- chdir(carpeta);
- getcwd(ruta_rom,MAXPATHLEN*2);
- chdir("..");
- sprintf(ruta_rom,"%s%s", ruta_rom,infodir->d_name);
- strcpy(buffer_rom[i++], ruta_rom);
- swiWaitForVBlank();
- }else{
- strcpy(buffer_rom[i++], infodir->d_name);
- swiWaitForVBlank();
- }
- break;
- }
- }
- closedir(directorio);
- }
- int Numero_Roms(const char* carpeta, u8 modo){
- DIR *directorio;
- struct dirent *infodir;
- u8 valido = 0;
- u16 rom = 0;
- u16 carp = 0;
- u16 result = 0;
- //Abrimos la carpeta
- directorio = opendir(carpeta);
- while((infodir = readdir(directorio)) != NULL )
- {
- valido = C_extension(infodir->d_name);
- switch(valido){
- case 0:
- if((strcmp(infodir->d_name,".") != 0) && (strcmp(infodir->d_name,"..") != 0) && (infodir->d_type == 4)){
- carp++;
- }
- swiWaitForVBlank();
- break;
- case 1:
- rom++;
- swiWaitForVBlank();
- break;
- }
- }
- closedir(directorio);
- //Con esto (de esta forma) evitamos un warning
- switch(modo){
- case 0:
- result = rom;
- break;
- case 1:
- result = carp;
- break;
- }
- return result;
- }
- //Aprovechamos la funcion para devolver el numero de carpetas totales
- int Listar_Carpetas(char **buffer_carpeta, const char* root){
- DIR *directorio;
- struct dirent *carpeta_dir;
- char ruta_base[MAXPATHLEN * 2];
- char ruta_carpeta[MAXPATHLEN * 2];
- u16 columna = 0;
- u16 num_all_carpetas = 1; //Por el root (nitro:/ o fat:/)
- directorio = opendir(root);
- while((carpeta_dir = readdir(directorio)) != NULL )
- {
- if((strcmp(carpeta_dir->d_name,".") != 0) && (strcmp(carpeta_dir->d_name,"..") != 0) && (carpeta_dir->d_type == 4)){
- //Obtenemos ruta original
- getcwd(ruta_base,MAXPATHLEN);
- //Añadimos la carpeta en la que nos encontramos
- sprintf(ruta_carpeta,"%s%s",ruta_base,carpeta_dir->d_name);
- //Copiamos la carpeta al buffer
- strcpy(buffer_carpeta[columna++], ruta_carpeta);
- //Sumamos una carpeta
- num_all_carpetas++;
- //Debug
- //NF_WriteTextVAR(0,0,1,columna,"%d %s",num_all_carpetas,buffer_carpeta[columna - 1]);
- //Micro Pausa (refresco)
- swiWaitForVBlank();
- }
- }
- closedir(directorio);
- //Con eso obtenemos las carpetas de root, ahora tocan las subfolder
- for(u16 carp = 0; carp < num_all_carpetas; carp++){
- directorio = opendir(buffer_carpeta[carp]);
- while((carpeta_dir = readdir(directorio)) != NULL )
- {
- if((strcmp(carpeta_dir->d_name,".") != 0) && (strcmp(carpeta_dir->d_name,"..") != 0) && (carpeta_dir->d_type == 4)){
- //Añadimos la carpeta en la que nos encontramos
- sprintf(ruta_carpeta,"%s/%s",buffer_carpeta[carp],carpeta_dir->d_name);
- //Copiamos la carpeta al buffer
- strcpy(buffer_carpeta[columna++], ruta_carpeta);
- //Sumamos una carpeta al loop
- num_all_carpetas++;
- //Debug
- //NF_WriteTextVAR(1,0,0,columna,"%d %s",carp + 1/*num_all_carpetas*/,buffer_carpeta[columna - 1]);
- //Volvemos al dir anterior
- chdir("..");
- //Micro Pausa (refresco)
- swiWaitForVBlank();
- }
- }
- closedir(directorio);
- }
- NF_WriteTextVAR(1,0,1,1,"Total: %d",num_all_carpetas);
- NF_UpdateTextLayers();
- return num_all_carpetas;
- }
- int Listar_Roms(char **buffer_roms, char **buffer_carpeta, u16 num_carp, const char* root){
- u16 roms = 0;
- //Obtenemos primero el root
- Dir_struct_rom(root,buffer_roms,0,true);
- roms += Numero_Roms(root, 0);
- for(int var = 0; var < num_carp; var++){
- Dir_struct_rom(buffer_carpeta[var],buffer_roms,roms,true);
- roms += Numero_Roms(buffer_carpeta[var], 0);
- NF_WriteTextVAR(0,0,1,var + 1, "%s", buffer_carpeta[var]);
- NF_WriteTextVAR(1,0,1,var + 1, "%s", buffer_roms[var]);
- NF_UpdateTextLayers();
- swiWaitForVBlank();
- }
- return roms;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement