Support for long file names in file selector, up to 27char.

Cleanup in the Load/Save function for all formats, preparing for big endianness fix.

git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@146 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
Yves Rizoud
2008-09-14 18:07:17 +00:00
parent beea105ef7
commit 2f5c16a8a0
7 changed files with 362 additions and 507 deletions

202
files.c
View File

@@ -6,7 +6,7 @@
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
@@ -35,6 +35,7 @@
#define COULEUR_REPERTOIRE_SELECT CM_Clair // Couleur du texte pour une ligne de repértoire sélectionnée
#define COULEUR_FOND_SELECT CM_Fonce // Couleur du fond pour une ligne sélectionnée
#define FILENAMESPACE 16
int Determiner_repertoire_courant(void)
// Modifie Principal_Repertoire_courant en y mettant sa nouvelle valeur (avec le nom du
@@ -72,8 +73,8 @@ int Repertoire_existe(char * Repertoire)
int Fichier_existe(char * Fichier)
// Dtermine si un fichier pass en paramŠtre existe ou non dans le
// rpertoire courant.
// Détermine si un fichier passé en paramŠtre existe ou non dans le
// répertoire courant.
{
struct stat buf;
int Resultat;
@@ -90,13 +91,13 @@ int Fichier_existe(char * Fichier)
// Conventions:
//
// * Le fileselect modifie le rpertoire courant. Ceci permet de n'avoir
// qu'un findfirst dans le rpertoire courant … faire:
// * Le fileselect modifie le répertoire courant. Ceci permet de n'avoir
// qu'un findfirst dans le répertoire courant … faire:
// -- Dstruction de la liste chaŒne ---------------------------------------
// -- Déstruction de la liste chaŒnée ---------------------------------------
void Detruire_liste_du_fileselect(void)
// Cette procdure dtruit la chaine des fichiers. Elle doit ˆtre appele
// Cette procédure détruit la chaine des fichiers. Elle doit être appelée
// avant de rappeler la fonction Lire_liste_des_fichiers, ainsi qu'en fin de
// programme.
{
@@ -105,17 +106,17 @@ void Detruire_liste_du_fileselect(void)
while (Liste_du_fileselect!=NULL)
{
// On mmorise l'adresse du premier lment de la liste
// On mémorise l'adresse du premier élément de la liste
Element_temporaire =Liste_du_fileselect;
// On fait avancer la tˆte de la liste
// On fait avancer la tête de la liste
Liste_du_fileselect=Liste_du_fileselect->Suivant;
// Et on efface l'ancien premier lment de la liste
// Et on efface l'ancien premier élément de la liste
free(Element_temporaire);
}
}
// -- Formatage graphique des noms de fichier / rpertoire ------------------
// -- Formatage graphique des noms de fichier / répertoire ------------------
char * Nom_formate(char * Nom)
{
static char Resultat[13];
@@ -130,7 +131,7 @@ char * Nom_formate(char * Nom)
else
{
strcpy(Resultat," . ");
// On commence par recopier la partie prcdent le point:
// On commence par recopier la partie précédent le point:
for (Curseur=0;( (Nom[Curseur]!='.') && (Nom[Curseur]!='\0') );Curseur++)
{
if (Curseur < 8)
@@ -141,7 +142,7 @@ char * Nom_formate(char * Nom)
if (Nom[Curseur]=='.')
Pos_DernierPoint = Curseur;
// Ensuite on recopie la partie qui suit le point (si ncessaire):
// Ensuite on recopie la partie qui suit le point (si nécessaire):
if (Nom[Pos_DernierPoint])
{
for (Curseur = Pos_DernierPoint+1,Autre_curseur=9;Nom[Curseur]!='\0' && Autre_curseur < 12;Curseur++,Autre_curseur++)
@@ -154,7 +155,7 @@ char * Nom_formate(char * Nom)
// -- Rajouter a la liste des elements de la liste un element ---------------
void Ajouter_element_a_la_liste(struct dirent* Enreg)
// Cette procedure ajoute a la liste chainee un fichier pass en argument.
// Cette procedure ajoute a la liste chainee un fichier passé en argument.
{
// Pointeur temporaire d'insertion
struct Element_de_liste_de_fileselect * Element_temporaire;
@@ -163,7 +164,8 @@ void Ajouter_element_a_la_liste(struct dirent* Enreg)
Element_temporaire=(struct Element_de_liste_de_fileselect *)malloc(sizeof(struct Element_de_liste_de_fileselect));
// On met a jour le nouvel emplacement:
strcpy(Element_temporaire->Nom,Nom_formate(Enreg->d_name));
strcpy(Element_temporaire->NomAbrege,Nom_formate(Enreg->d_name));
strcpy(Element_temporaire->NomComplet,Enreg->d_name);
#ifdef __linux__
Element_temporaire->Type = (Enreg->d_type == DT_DIR);
#elif __WATCOMC__
@@ -182,6 +184,37 @@ void Ajouter_element_a_la_liste(struct dirent* Enreg)
Liste_du_fileselect=Element_temporaire;
}
// -- Vérification si un fichier a l'extension demandée.
// Autorise les '?', et '*' si c'est le seul caractère.
int VerifieExtension(const char *NomFichier, char * Filtre)
{
int Pos_DernierPoint = -1;
int Curseur = 0;
if (Filtre[0] == '*')
return 1;
// On recherche la position du dernier . dans le nom
for (Curseur = 0; NomFichier[Curseur]!='\0'; Curseur++)
if (NomFichier[Curseur]=='.')
Pos_DernierPoint = Curseur;
// Fichier sans extension (ca arrive)
if (Pos_DernierPoint == -1)
return (Filtre[0] == '\0');
// Vérification caractère par caractère, case-insensitive.
Curseur = 0;
do
{
if (Filtre[Curseur] != '?' &&
tolower(Filtre[Curseur]) != tolower(NomFichier[Pos_DernierPoint + 1 + Curseur]))
return 0;
Curseur++;
} while (Filtre[Curseur++] != '\0');
return 1;
}
// -- Lecture d'une liste de fichiers ---------------------------------------
void Lire_liste_des_fichiers(byte Format_demande)
@@ -190,15 +223,12 @@ void Lire_liste_des_fichiers(byte Format_demande)
{
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'
char * Filtre = "*"; // Extension demandée
struct stat Infos_enreg;
// Tout d'abord, on déduit du format demandé un filtre à utiliser:
if (Format_demande) // Format (extension) spécifique
strcat(Filtre,Format_Extension[Format_demande-1]);
else // *.*
strcat(Filtre,"*");
Filtre = Format_Extension[Format_demande-1];
// Ensuite, on vide la liste actuelle:
Detruire_liste_du_fileselect();
@@ -218,19 +248,22 @@ void Lire_liste_des_fichiers(byte Format_demande)
stat(Enreg->d_name,&Infos_enreg);
// et que l'élément trouvé est un répertoire
if( S_ISDIR(Infos_enreg.st_mode) &&
// et qu'il n'est pas caché
((!isHidden(Enreg)) || !Config.Lire_les_repertoires_caches))
// et qu'il n'est pas caché
((!isHidden(Enreg)) || !Config.Lire_les_repertoires_caches))
{
// On rajoute le répertore à la liste
Ajouter_element_a_la_liste(Enreg);
Liste_Nb_repertoires++;
// On rajoute le répertore à la liste
Ajouter_element_a_la_liste(Enreg);
Liste_Nb_repertoires++;
}
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é
&& ((!isHidden(Enreg)) || !Config.Lire_les_fichiers_caches)) //Il n'est pas caché
{
// On rajoute le fichier à la liste
Ajouter_element_a_la_liste(Enreg);
Liste_Nb_fichiers++;
if (VerifieExtension(Enreg->d_name, Filtre))
{
// On rajoute le fichier à la liste
Ajouter_element_a_la_liste(Enreg);
Liste_Nb_fichiers++;
}
}
}
@@ -244,27 +277,27 @@ void Lire_liste_des_fichiers(byte Format_demande)
}
// -- Tri de la liste des fichiers et rpertoires ---------------------------
// -- Tri de la liste des fichiers et répertoires ---------------------------
void Trier_la_liste_des_fichiers(void)
// Tri la liste chaine existante dans l'ordre suivant:
// Tri la liste chainée existante dans l'ordre suivant:
//
// * Les rpertoires d'abord, dans l'ordre alphabtique de leur nom
// * Les fichiers ensuite, dans l'ordre alphabtique de leur nom
// * Les répertoires d'abord, dans l'ordre alphabétique de leur nom
// * Les fichiers ensuite, dans l'ordre alphabétique de leur nom
{
byte La_liste_est_triee; // Boolen "La liste est trie"
byte Inversion; // Boolen "Il faut inverser les lments"
byte La_liste_est_triee; // Booléen "La liste est triée"
byte Inversion; // Booléen "Il faut inverser les éléments"
struct Element_de_liste_de_fileselect * Element_precedent;
struct Element_de_liste_de_fileselect * Element_courant;
struct Element_de_liste_de_fileselect * Element_suivant;
struct Element_de_liste_de_fileselect * Element_suivant_le_suivant;
// Avant de trier quoi que ce soit, on vrifie qu'il y ait suffisamment
// d'lments pour qu'il soit possibles qu'ils soient en dsordre:
// Avant de trier quoi que ce soit, on vérifie qu'il y ait suffisamment
// d'éléments pour qu'il soit possibles qu'ils soient en désordre:
if (Liste_Nb_elements>1)
{
do
{
// Par dfaut, on considŠre que la liste est trie
// Par défaut, on considŠre que la liste est triée
La_liste_est_triee=1;
Element_courant=Liste_du_fileselect;
@@ -275,55 +308,55 @@ void Trier_la_liste_des_fichiers(void)
// On commence par supposer qu'il n'y pas pas besoin d'inversion
Inversion=0;
// Ensuite, on vrifie si les deux lments sont bien dans l'ordre ou
// Ensuite, on vérifie si les deux éléments sont bien dans l'ordre ou
// non:
// Si l'lment courant est un fichier est que le suivant est
// un rpertoire -> Inversion
// Si l'élément courant est un fichier est que le suivant est
// un répertoire -> Inversion
if ( (Element_courant->Type==0) && (Element_suivant->Type==1) )
Inversion=1;
// Si les deux lments sont de mˆme type et que le nom du suivant
// Si les deux éléments sont de même type et que le nom du suivant
// est plus petit que celui du courant -> Inversion
else if ( (Element_courant->Type==Element_suivant->Type) &&
(strcmp(Element_courant->Nom,Element_suivant->Nom)>0) )
(strcmp(Element_courant->NomComplet,Element_suivant->NomComplet)>0) )
Inversion=1;
if (Inversion)
{
// Si les deux lments ncessitent d'ˆtre invers:
// Si les deux éléments nécessitent d'être inversé:
// On les inverses:
// On note avant tout les lments qui encapsulent nos deux amis
// On note avant tout les éléments qui encapsulent nos deux amis
Element_precedent =Element_courant->Precedent;
Element_suivant_le_suivant=Element_suivant->Suivant;
// On permute le chaŒnage des deux lments entree eux
// On permute le chaŒnage des deux éléments entree eux
Element_courant->Suivant =Element_suivant_le_suivant;
Element_courant->Precedent=Element_suivant;
Element_suivant->Suivant =Element_courant;
Element_suivant->Precedent=Element_precedent;
// On tente un chaŒnage des lments encapsulant les compŠres:
// On tente un chaŒnage des éléments encapsulant les compŠres:
if (Element_precedent!=NULL)
Element_precedent->Suivant=Element_suivant;
if (Element_suivant_le_suivant!=NULL)
Element_suivant_le_suivant->Precedent=Element_courant;
// On fait bien attention … modifier la tˆte de liste en cas de besoin
// On fait bien attention … modifier la tête de liste en cas de besoin
if (Element_courant==Liste_du_fileselect)
Liste_du_fileselect=Element_suivant;
// Ensuite, on se prpare … tudier les lments prcdents:
// Ensuite, on se prépare … étudier les éléments précédents:
Element_courant=Element_precedent;
// Et on constate que la liste n'tait pas encore gnialement trie
// Et on constate que la liste n'était pas encore génialement triée
La_liste_est_triee=0;
}
else
{
// Si les deux lments sont dans l'ordre:
// Si les deux éléments sont dans l'ordre:
// On passe aux suivants
Element_courant=Element_courant->Suivant;
@@ -336,14 +369,14 @@ void Trier_la_liste_des_fichiers(void)
}
// -- Affichage des lments de la liste de fichier / rpertoire ------------
// -- Affichage des éléments de la liste de fichier / répertoire ------------
void Afficher_la_liste_des_fichiers(short Decalage_premier,short Decalage_select)
//
// Decalage_premier = Dcalage entre le premier fichier visible dans le
// slecteur et le premier fichier de la liste
// Decalage_premier = Décalage entre le premier fichier visible dans le
// sélecteur et le premier fichier de la liste
//
// Decalage_select = Dcalage entre le premier fichier visible dans le
// slecteur et le fichier slectionn dans la liste
// Decalage_select = Décalage entre le premier fichier visible dans le
// sélecteur et le fichier sélectionné dans la liste
//
{
struct Element_de_liste_de_fileselect * Element_courant;
@@ -352,7 +385,7 @@ void Afficher_la_liste_des_fichiers(short Decalage_premier,short Decalage_select
byte Couleur_fond;
// On vrifie s'il y a au moins 1 fichier dans la liste:
// On vérifie s'il y a au moins 1 fichier dans la liste:
if (Liste_Nb_elements>0)
{
// On commence par chercher … pointer sur le premier fichier visible:
@@ -360,10 +393,10 @@ void Afficher_la_liste_des_fichiers(short Decalage_premier,short Decalage_select
for (;Decalage_premier>0;Decalage_premier--)
Element_courant=Element_courant->Suivant;
// Pour chacun des 10 lments inscriptibles … l'cran
// Pour chacun des 10 éléments inscriptibles … l'écran
for (Indice=0;Indice<10;Indice++)
{
// S'il est slectionn:
// S'il est sélectionné:
if (!Decalage_select)
{
// Si c'est un fichier
@@ -385,8 +418,8 @@ void Afficher_la_liste_des_fichiers(short Decalage_premier,short Decalage_select
Couleur_fond=COULEUR_FOND_NORMAL;
}
// On affiche l'lment
Print_dans_fenetre(9,90+(Indice<<3),Element_courant->Nom,Couleur_texte,Couleur_fond);
// On affiche l'élément
Print_dans_fenetre(9,90+FILENAMESPACE+(Indice<<3),Element_courant->NomAbrege,Couleur_texte,Couleur_fond);
// On passe … la ligne suivante
Decalage_select--;
@@ -399,65 +432,62 @@ void Afficher_la_liste_des_fichiers(short Decalage_premier,short Decalage_select
}
// -- Rcuprer le libell d'un lment de la liste -------------------------
// -- Récupérer le libellé d'un élément de la liste -------------------------
void Determiner_element_de_la_liste(short Decalage_premier,short Decalage_select,char * Libelle)
//
// Decalage_premier = Dcalage entre le premier fichier visible dans le
// slecteur et le premier fichier de la liste
// Decalage_premier = Décalage entre le premier fichier visible dans le
// sélecteur et le premier fichier de la liste
//
// Decalage_select = Dcalage entre le premier fichier visible dans le
// slecteur et le fichier … rcuprer
// Decalage_select = Décalage entre le premier fichier visible dans le
// sélecteur et le fichier … récupérer
//
// Libelle = Chaine de rception du libell de l'lment
// Libelle = Chaine de réception du libellé de l'élément
//
{
struct Element_de_liste_de_fileselect * Element_courant;
char * Curseur;
// On vrifie s'il y a au moins 1 fichier dans la liste:
// On vérifie s'il y a au moins 1 fichier dans la liste:
if (Liste_Nb_elements>0)
{
// On commence par chercher pointer sur le premier fichier visible:
// On commence par chercher à pointer sur le premier fichier visible:
Element_courant=Liste_du_fileselect;
for (;Decalage_premier>0;Decalage_premier--)
Element_courant=Element_courant->Suivant;
// Ensuite, on saute autant d'lments que le dcalage demand:
// Ensuite, on saute autant d'éléments que le décalage demandé:
for (;Decalage_select>0;Decalage_select--)
Element_courant=Element_courant->Suivant;
// On recopie la chaŒne en la dformatant (i.e. tous les chars sauf ' ')
for (Curseur=Element_courant->Nom;*Curseur!='\0';Curseur++)
if (*Curseur!=' ')
*(Libelle++)=*Curseur;
*Libelle='\0';
// On recopie la chaîne
strcpy(Libelle, Element_courant->NomComplet);
} // Fin du test d'existence de fichiers
}
// ----------------- Dplacements dans la liste de fichiers -----------------
// ----------------- Déplacements dans la liste de fichiers -----------------
void Select_Scroll_Down(short * Decalage_premier,short * Decalage_select)
// Fait scroller vers le bas le slecteur de fichier... (si possible)
// Fait scroller vers le bas le sélecteur de fichier... (si possible)
{
if ( ((*Decalage_select)<9)
&& ( (*Decalage_select)+1 < Liste_Nb_elements ) )
// Si la slection peut descendre
// Si la sélection peut descendre
Afficher_la_liste_des_fichiers(*Decalage_premier,++(*Decalage_select));
else // Sinon, descendre la fenˆtre (si possible)
else // Sinon, descendre la fenêtre (si possible)
if ((*Decalage_premier)+10<Liste_Nb_elements)
Afficher_la_liste_des_fichiers(++(*Decalage_premier),*Decalage_select);
}
void Select_Scroll_Up(short * Decalage_premier,short * Decalage_select)
// Fait scroller vers le haut le slecteur de fichier... (si possible)
// Fait scroller vers le haut le sélecteur de fichier... (si possible)
{
if ((*Decalage_select)>0)
// Si la slection peut monter
// Si la sélection peut monter
Afficher_la_liste_des_fichiers(*Decalage_premier,--(*Decalage_select));
else // Sinon, monter la fenˆtre (si possible)
else // Sinon, monter la fenêtre (si possible)
if ((*Decalage_premier)>0)
Afficher_la_liste_des_fichiers(--(*Decalage_premier),*Decalage_select);
}
@@ -534,14 +564,14 @@ void Select_Home(short * Decalage_premier,short * Decalage_select)
short Calculer_decalage_click_dans_fileselector(void)
/*
Renvoie le dcalage dans le slecteur de fichier sur lequel on a click.
Renvoie le dcalage du dernier fichier si on a click au del….
Renvoie -1 si le slecteur est vide.
Renvoie le décalage dans le sélecteur de fichier sur lequel on a clické.
Renvoie le décalage du dernier fichier si on a clické au del….
Renvoie -1 si le sélecteur est vide.
*/
{
short Decalage_calcule;
Decalage_calcule=(((Mouse_Y-Fenetre_Pos_Y)/Menu_Facteur_Y)-90)>>3;
Decalage_calcule=(((Mouse_Y-Fenetre_Pos_Y)/Menu_Facteur_Y)-(90+FILENAMESPACE))>>3;
if (Decalage_calcule>=Liste_Nb_elements)
Decalage_calcule=Liste_Nb_elements-1;