From aaf7bc09fafac1f5ba9cefc79cb26289e00a6edb Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Fri, 1 Aug 2008 13:17:29 +0000 Subject: [PATCH] Some work on file loading git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@90 416bcca6-2ee7-4201-b75f-2eb2f807beb1 --- files.c | 20 ++++++++++---------- loadsave.c | 30 ++++++++++++++---------------- 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/files.c b/files.c index cad07c7d..5b76c1f0 100644 --- a/files.c +++ b/files.c @@ -13,17 +13,15 @@ #include #include +#include "erreurs.h" + #ifdef __linux__ #include "linux.h" #include - #define isDir(Enreg) ((Enreg)->d_type == DT_DIR) #define isHidden(Enreg) ((Enreg)->d_name[0]=='.') - #define isFile(Enreg) (Enreg->d_type==DT_REG) #elif __WATCOMC__ #include - #define isDir(Enreg) ((Enreg)->d_attr & _A_SUBDIR) #define isHidden(Enreg) ((Enreg)->d_attr & _A_HIDDEN) - #define isFile(Enreg) ((Enreg)->d_attr & _A_SUBDIR == 0) #endif #define COULEUR_FICHIER_NORMAL CM_Clair // Couleur du texte pour une ligne de fichier non sélectionné @@ -171,12 +169,13 @@ void Ajouter_element_a_la_liste(struct dirent* Enreg) // -- Lecture d'une liste de fichiers --------------------------------------- void Lire_liste_des_fichiers(byte Format_demande) -// Cette proc‚dure charge dans la liste chain‚e les fichiers dont l'extension -// correspond au format demand‚. +// Cette procédure charge dans la liste chainée les fichiers dont l'extension +// correspond au format demandé. { DIR* Repertoire_Courant; //Répertoire courant struct dirent* Enreg; // Structure de lecture des éléments char Filtre[6]="*."; // Place pour écrire "*.XXX" et un '\0' + struct stat Infos_enreg; // Tout d'abord, on déduit du format demandé un filtre à utiliser: if (Format_demande) // Format (extension) spécifique @@ -200,17 +199,18 @@ void Lire_liste_des_fichiers(byte Format_demande) // Si l'élément n'est pas le répertoire courant if ( (Enreg->d_name[0]!='.') && (Enreg->d_name[1] != 0)) { + stat(Enreg->d_name,&Infos_enreg); // et que l'élément trouvé est un répertoire - if( isDir(Enreg) && + if( S_ISDIR(Infos_enreg.st_mode) && // et qu'il n'est pas caché - ((!isHidden(Enreg)) || Config.Lire_les_repertoires_caches)) + ((!isHidden(Enreg)) || !Config.Lire_les_repertoires_caches)) { // On rajoute le répertore à la liste Ajouter_element_a_la_liste(Enreg); Liste_Nb_repertoires++; } - else if (isFile(Enreg) //Il s'agit d'un fichier - && ((!isHidden(Enreg)) || Config.Lire_les_fichiers_caches)) //Il n'est pas caché + else if (S_ISREG(Infos_enreg.st_mode) //Il s'agit d'un fichier + && ((!isHidden(Enreg)) || !Config.Lire_les_fichiers_caches)) //Il n'est pas caché { // On rajoute le fichier à la liste Ajouter_element_a_la_liste(Enreg); diff --git a/loadsave.c b/loadsave.c index 8e8ca986..ce04e28c 100644 --- a/loadsave.c +++ b/loadsave.c @@ -14,17 +14,14 @@ #include #include +#include #include "boutons.h" +#include "erreurs.h" #ifdef __linux__ #include "linux.h" #endif -// On déclare méchamment le prototype de Erreur pour éviter de faire un -// fichier "main.h": -void Erreur(int Code); - - // Chargement des pixels dans l'écran principal void Pixel_Chargement_dans_ecran_courant(word Pos_X,word Pos_Y,byte Couleur) { @@ -607,7 +604,7 @@ void Test_PAL(void) int Fichier; // Handle du fichier char Nom_du_fichier[256]; // Nom complet du fichier long Taille_du_fichier; // Taille du fichier - struct stat* Informations_Fichier=NULL; + struct stat Informations_Fichier; Nom_fichier_complet(Nom_du_fichier,0); @@ -617,9 +614,9 @@ void Test_PAL(void) Fichier=open(Nom_du_fichier,O_RDONLY); if (Fichier!=-1) { - stat(Nom_du_fichier,Informations_Fichier); + stat(Nom_du_fichier,&Informations_Fichier); // Lecture de la taille du fichier - Taille_du_fichier=Informations_Fichier->st_size; + Taille_du_fichier=Informations_Fichier.st_size; close(Fichier); // Le fichier ne peut ˆtre au format PAL que si sa taille vaut 768 octets if (Taille_du_fichier==sizeof(T_Palette)) @@ -1158,7 +1155,7 @@ void Load_PKM(void) // Ensuite Recon1 devient celle la moins utilisée de celles-ci *Recon1=0; Best=1; - NBest=1000000; // Une mˆme couleur ne pourra jamais ˆtre utilisée 1M de fois. + NBest=INT_MAX; // Une mˆme couleur ne pourra jamais ˆtre utilisée 1M de fois. for (Indice=1;Indice<=255;Indice++) if (Find_recon[Indice] Clear tables word Valeur_Eof; // Valeur <=> Fin d'image long Taille_du_fichier; - struct stat* Informations_Fichier=NULL; + struct stat Informations_Fichier; /////////////////////////////////////////////////// FIN DES DECLARATIONS // @@ -2727,8 +2724,8 @@ void Load_GIF(void) if ((GIF_Fichier=open(Nom_du_fichier,O_RDONLY))!=-1) { - stat(Nom_du_fichier,Informations_Fichier); - Taille_du_fichier=Informations_Fichier->st_size; + stat(Nom_du_fichier,&Informations_Fichier); + Taille_du_fichier=Informations_Fichier.st_size; if ( (read(GIF_Fichier,Signature,6)==6) && ( (memcmp(Signature,"GIF87a",6)==0) || @@ -3889,7 +3886,7 @@ void Test_CEL(void) word Decalage_Y; // Decalage en Y de l'image byte Filler2[16]; // ??? } Header2; - struct stat* Informations_Fichier =NULL; + struct stat Informations_Fichier; Erreur_fichier=0; Nom_fichier_complet(Nom_du_fichier,0); @@ -3899,8 +3896,9 @@ void Test_CEL(void) { // Vu que ce header n'a pas de signature, il va falloir tester la // cohérence de la dimension de l'image avec celle du fichier. - stat(Nom_du_fichier,Informations_Fichier); - Taille=(Informations_Fichier->st_size)-sizeof(struct CEL_Header1); + if (!stat(Nom_du_fichier,&Informations_Fichier)) + Erreur_fichier = 1; // Si on ne peut pas faire de stat il vaut mieux laisser tomber + Taille=(Informations_Fichier.st_size)-sizeof(struct CEL_Header1); if ( (!Taille) || ( (((Header1.Width+1)>>1)*Header1.Height)!=Taille ) ) { // Tentative de reconnaissance de la signature des nouveaux fichiers