Removed some old DOS code, unified (for gcc) the handling of file paths.

Probably fixed some linux issues there.
Fixed the filename search by typing in Save/load.


git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@196 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
Yves Rizoud 2008-10-04 21:56:02 +00:00
parent 16f642c689
commit dd984538bf
10 changed files with 108 additions and 187 deletions

View File

@ -1,6 +1,6 @@
main.o: main.c const.h struct.h global.h loadsave.h graph.h divers.h \
init.h boutons.h moteur.h pages.h files.h sdlscreen.h erreurs.h \
readini.h saveini.h linux.h
readini.h saveini.h linux.h io.h
init.o: init.c const.h struct.h global.h loadsave.h graph.h boutons.h \
palette.h aide.h operatio.h divers.h erreurs.h clavier.h io.h
graph.o: graph.c sdlscreen.h struct.h const.h graph.h divers.h moteur.h \
@ -13,7 +13,7 @@ special.o: special.c const.h struct.h global.h loadsave.h graph.h \
moteur.h
boutons.o: boutons.c const.h struct.h global.h loadsave.h divers.h \
graph.h moteur.h readline.h files.h init.h boutons.h operatio.h pages.h \
erreurs.h readini.h saveini.h shade.h
erreurs.h readini.h saveini.h shade.h io.h
palette.o: palette.c const.h struct.h global.h loadsave.h divers.h \
graph.h moteur.h readline.h boutons.h pages.h
aide.o: aide.c const.h struct.h global.h loadsave.h divers.h graph.h \
@ -39,4 +39,4 @@ saveini.o: saveini.c const.h global.h struct.h loadsave.h readini.h \
shade.o: shade.c global.h struct.h const.h loadsave.h graph.h moteur.h \
divers.h readline.h
clavier.o: clavier.c global.h struct.h const.h loadsave.h
io.o: io.c struct.h const.h
io.o: io.c struct.h const.h io.h

View File

@ -23,6 +23,7 @@
#include "readini.h"
#include "saveini.h"
#include "shade.h"
#include "io.h"
#ifdef __WATCOMC__
#include <windows.h>
@ -2103,7 +2104,7 @@ void Print_repertoire_courant(void)
// Ensuite, on cherche un endroit à partir duquel on pourrait loger tout
// le reste de la chaine (Ouaaaaaah!!! Vachement fort le mec!!)
for (Indice++;Indice<Longueur;Indice++)
if ( (Principal_Repertoire_courant[Indice]=='\\') &&
if ( (Principal_Repertoire_courant[Indice]==SEPARATEUR_CHEMIN[0]) &&
(Longueur-Indice<=TAILLE_MAXI_PATH-6) )
{
// Ouf: on vient de trouver un endroit dans la chaîne à partir duquel
@ -2239,9 +2240,6 @@ void Placer_barre_de_selection_sur(char * Nom)
char FFF_Meilleur_nom[TAILLE_CHEMIN_FICHIER];
char * Nom_correspondant_le_mieux_a(char * Nom)
{
char Nom_courant[TAILLE_CHEMIN_FICHIER];
char * Pointeur1;
char * Pointeur2;
char * Pointeur_Meilleur_nom;
struct Element_de_liste_de_fileselect * Element_courant;
byte Lettres_identiques=0;
@ -2255,18 +2253,12 @@ char * Nom_correspondant_le_mieux_a(char * Nom)
if ( (!Config.Find_file_fast)
|| (Config.Find_file_fast==(Element_courant->Type+1)) )
{
// On copie le nom de la liste en cours de traitement dans Nom_courant
// tout en le remettant sous forme normale.
for (Pointeur1=Element_courant->NomComplet,Pointeur2=Nom_courant;*Pointeur1;Pointeur1++)
if (*Pointeur1!=' ')
*(Pointeur2++)=*Pointeur1;
*Pointeur2=0;
// On compare et si c'est mieux, on stocke dans Meilleur_nom
for (Compteur=0; tolower(Nom_courant[Compteur])==tolower(Nom[Compteur]); Compteur++);
for (Compteur=0; tolower(Element_courant->NomComplet[Compteur])==tolower(Nom[Compteur]); Compteur++);
if (Compteur>Lettres_identiques)
{
Lettres_identiques=Compteur;
strcpy(FFF_Meilleur_nom,Nom_courant);
strcpy(FFF_Meilleur_nom,Element_courant->NomComplet);
Pointeur_Meilleur_nom=Element_courant->NomComplet;
}
}
@ -2390,16 +2382,20 @@ byte Bouton_Load_ou_Save(byte Load, byte Image)
}
// On prend bien soin de passer dans le répertoire courant (le bon qui faut! Oui madame!)
chdir(Principal_Repertoire_courant);
/*_dos_setdrive(Principal_Repertoire_courant[0]-64,&Bidon);*/
Determiner_repertoire_courant();
if (Load)
{
chdir(Principal_Repertoire_courant);
Determiner_repertoire_courant();
}
else
{
chdir(Principal_Repertoire_fichier);
Determiner_repertoire_courant();
}
// Affichage des premiers fichiers visibles:
Relire_liste_fichiers(Principal_Format,Principal_File_list_Position,Principal_File_list_Decalage,Scroller_de_fichiers);
// Je n'efface pas cette partie parce que l'idée n'était pas mauvaise mais
// ça chie un maximum alors autant ne pas trop compliquer les choses...
/*
if (!Load)
{
// On initialise le nom de fichier à celui en cours et non pas celui sous
@ -2408,7 +2404,6 @@ byte Bouton_Load_ou_Save(byte Load, byte Image)
// On affiche le nouveau nom de fichier
Print_Nom_fichier_dans_selecteur();
}
*/
Pixel_de_chargement=Pixel_Chargement_dans_preview;
Nouvelle_preview=1;
@ -2679,11 +2674,10 @@ byte Bouton_Load_ou_Save(byte Load, byte Image)
Temp=strlen(Fichier_recherche);
if (Touche_ANSI>= ' ' && Touche_ANSI < 255 && Temp<50)
{
Fichier_recherche[Temp]=toupper(Touche_ANSI);
Fichier_recherche[Temp+1]=0;
Fichier_recherche[Temp]=Touche_ANSI;
Fichier_recherche[Temp+1]='\0';
Fichier_le_plus_ressemblant=Nom_correspondant_le_mieux_a(Fichier_recherche);
if ( (Fichier_le_plus_ressemblant)
&& (!memcmp(Fichier_recherche,FFF_Meilleur_nom,Temp+1)) )
if ( (Fichier_le_plus_ressemblant) )
{
Temp=Principal_File_list_Position+Principal_File_list_Decalage;
Effacer_curseur();
@ -2694,7 +2688,7 @@ byte Bouton_Load_ou_Save(byte Load, byte Image)
Nouvelle_preview=1;
}
else
Fichier_recherche[Temp]=0;
*Fichier_recherche=0;
}
}
else
@ -2715,10 +2709,9 @@ byte Bouton_Load_ou_Save(byte Load, byte Image)
strcpy(Repertoire_precedent,Nom_formate(".."));
else
{
for (Temp=strlen(Principal_Repertoire_courant);
(Temp>0) && (Principal_Repertoire_courant[Temp-1]!='\\');
Temp--);
strcpy(Repertoire_precedent,Nom_formate(Principal_Repertoire_courant+Temp));
strcpy(Repertoire_precedent,
Nom_formate(Position_dernier_slash(Principal_Repertoire_courant))
);
}
// On doit rentrer dans le répertoire:

View File

@ -578,45 +578,6 @@ byte Lit_pixel_dans_ecran_backup (word X,word Y)
return *(Ecran_backup + X + Principal_Largeur_image * Y);
}
byte Type_de_lecteur_de_disquette(byte Numero_de_lecteur)
// Numero_de_lecteur compris entre 0 et 3 (4 lecteurs de disquettes)
//
// Résultat = 0 : Pas de lecteur
// 1 : Lecteur 360 Ko
// 2 : Lecteur 1.2 Mo
// 3 : Lecteur 720 Ko
// 4 : Lecteur 1.4 Mo
// 5 : Lecteur 2.8 Mo (??? pas sur ???)
// 6 : Lecteur 2.8 Mo
{
UNIMPLEMENTED
return 0;
}
byte Disk_map(byte Numero_de_lecteur)
{
UNIMPLEMENTED
return 0;
}
byte Disque_dur_present(byte Numero_de_disque)
{
UNIMPLEMENTED
return 0;
}
byte Lecteur_CDROM_present(byte Numero_de_lecteur)
{
UNIMPLEMENTED
return 0;
}
long Freespace(byte Numero_de_lecteur)
{
UNIMPLEMENTED
return 0;
}
// Les images ILBM sont stockés en bitplanes donc on doit trifouiller les bits pour
// en faire du chunky

View File

@ -35,52 +35,6 @@ byte Lit_pixel_dans_ecran_backup (word X,word Y);
byte Lit_pixel_dans_ecran_feedback (word X,word Y);
byte Lit_pixel_dans_brosse (word X,word Y);
long Freespace(byte Numero_de_lecteur);
// Numero_de_lecteur = 0 : Disque courant
// 1 : lecteur A:
// 2 : lecteur B:
// 3 : lecteur C:
// ... : ...
//
// Résultat = -1 si lecteur invalide, taille disponible sinon
byte Type_de_lecteur_de_disquette(byte Numero_de_lecteur);
// Numero_de_lecteur compris entre 0 et 3 (4 lecteurs de disquettes)
//
// Résultat = 0 : Pas de lecteur
// 1 : Lecteur 360 Ko
// 2 : Lecteur 1.2 Mo
// 3 : Lecteur 720 Ko
// 4 : Lecteur 1.4 Mo
// 5 : Lecteur 2.8 Mo (??? pas sur ???)
// 6 : Lecteur 2.8 Mo
byte Disk_map(byte Numero_de_lecteur);
// Renseigne sur la lettre logique d'un lecteur
// (utile pour tester si un lecteur de disquette est A: ou B: aux yeux du DOS)
//
// Entrée: Octet = n° du lecteur (1=A, 2=B ...)
//
// Sortie: Octet = 0FFh : Pas de lecteur (???)
// sinon: numéro représenatan la lettre logique du lecteur
// (commence à 1)
byte Disque_dur_present(byte Numero_de_disque);
// Numero_de_disque = 0:C, 1:D, 2:E, ...
//
// Résultat = 0 : Pas de disque dur présent
// 1 : Disque dur présent
byte Lecteur_CDROM_present(byte Numero_de_lecteur);
// Numero_de_lecteur = 0 : lecteur A:
// 1 : lecteur B:
// 2 : lecteur C:
// ... : ...
//
// Résultat = 0 : Pas de lecteur CD-ROM présent
// 1 : Lecteur CD-ROM présent
void Ellipse_Calculer_limites(short Rayon_horizontal,short Rayon_vertical);
// Calcule les valeurs suivantes en fonction des deux paramètres:
//

38
init.c
View File

@ -31,13 +31,7 @@
// Chercher le répertoire contenant GFX2.EXE
void Chercher_repertoire_du_programme(char * Chaine)
{
#ifdef __WATCOMC__
GetCurrentDirectory(255,Repertoire_du_programme);
strcat(Repertoire_du_programme,"\\");
#else
puts("Chercher_repertoire_du_programme: implémentation incomplète");
Repertoire_du_programme[0]=0; //On va travailler dans le dossier courant ...
#endif
Extraire_chemin(Repertoire_du_programme, Chaine);
}
@ -202,21 +196,23 @@ void Charger_DAT(void)
strcpy(Nom_du_fichier,Repertoire_du_programme);
strcat(Nom_du_fichier,"gfx2.dat");
if(stat(Nom_du_fichier,&Informations_Fichier))
switch errno
{
case EACCES: puts("La permission de parcours est refusée pour un des répertoires contenu dans le chemin path."); break;
case EBADF: puts("filedes est un mauvais descripteur."); break;
case EFAULT: puts("Un pointeur se trouve en dehors de l'espace d'adressage."); break;
case ENAMETOOLONG: puts("Nom de fichier trop long."); break;
case ENOENT: puts("Un composant du chemin path n'existe pas, ou il s'agit d'une chaîne vide."); break;
case ENOMEM: puts("Pas assez de mémoire pour le noyau."); break;
case ENOTDIR: puts("Un composant du chemin d'accès n'est pas un répertoire."); break;
#ifdef __linux__
case ELOOP: puts("Trop de liens symboliques rencontrés dans le chemin d'accès."); break;
#endif
}
{
switch errno
{
case EACCES: puts("La permission de parcours est refusée pour un des répertoires contenu dans le chemin path."); break;
case EBADF: puts("filedes est un mauvais descripteur."); break;
case EFAULT: puts("Un pointeur se trouve en dehors de l'espace d'adressage."); break;
case ENAMETOOLONG: puts("Nom de fichier trop long."); break;
case ENOENT: puts("Un composant du chemin path n'existe pas, ou il s'agit d'une chaîne vide."); break;
case ENOMEM: puts("Pas assez de mémoire pour le noyau."); break;
case ENOTDIR: puts("Un composant du chemin d'accès n'est pas un répertoire."); break;
#ifdef __linux__
case ELOOP: puts("Trop de liens symboliques rencontrés dans le chemin d'accès."); break;
#endif
}
}
Taille_fichier=Informations_Fichier.st_size;
if (Taille_fichier<DAT_DEBUT_INI_PAR_DEFAUT)

45
io.c
View File

@ -3,7 +3,9 @@
// little-endian.
#include <SDL/SDL_endian.h>
#include <string.h>
#include "struct.h"
#include "io.h"
word endian_magic16(word x)
{
@ -13,7 +15,7 @@ word endian_magic16(word x)
return SDL_Swap16(x);
#endif
}
word endian_magic32(word x)
dword endian_magic32(dword x)
{
#if SDL_BYTEORDER == SDL_LIL_ENDIAN
return x;
@ -128,3 +130,44 @@ int write_dword_be(FILE *Fichier, dword Mot)
#endif
return fwrite(&Mot, 1, sizeof(dword), Fichier) == sizeof(dword);
}
// Détermine la position du dernier '/' ou '\\' dans une chaine,
// typiquement pour séparer le nom de fichier d'un chemin.
// Attention, sous Windows, il faut s'attendre aux deux car
// par exemple un programme lancé sous GDB aura comme argv[0]:
// d:\Data\C\GFX2\grafx2/grafx2.exe
char * Position_dernier_slash(const char * Chaine)
{
const char * Position = NULL;
for (; *Chaine != '\0'; Chaine++)
if (*Chaine == SEPARATEUR_CHEMIN[0]
#ifdef __WIN32__
|| *Chaine == '/'
#endif
)
Position = Chaine;
return (char *)Position;
}
// Récupère la partie "nom de fichier seul" d'un chemin
void Extraire_nom_fichier(char *Destination, const char *Source)
{
const char * Position = Position_dernier_slash(Source);
if (Position)
strcpy(Destination,Position+1);
else
strcpy(Destination,Source);
}
// Récupère la partie "répertoire+/" d'un chemin.
void Extraire_chemin(char *Destination, const char *Source)
{
char * Position;
strcpy(Destination,Source);
Position = Position_dernier_slash(Destination);
if (Position)
*(Position+1) = '\0';
else
strcat(Destination, SEPARATEUR_CHEMIN);
}

11
io.h
View File

@ -17,3 +17,14 @@ int read_word_be(FILE *Fichier, word *Dest);
int write_word_be(FILE *Fichier, word Mot);
int read_dword_be(FILE *Fichier, dword *Dest);
int write_dword_be(FILE *Fichier, dword Mot);
void Extraire_nom_fichier(char *Destination, const char *Source);
void Extraire_chemin(char *Destination, const char *Source);
char * Position_dernier_slash(const char * Chaine);
#ifdef __linux__
#define SEPARATEUR_CHEMIN "/"
#else
#define SEPARATEUR_CHEMIN "\\"
#endif

16
linux.c
View File

@ -5,22 +5,6 @@
#include <stdio.h>
#include <sys/stat.h>
void _splitpath(char* Buffer, char* Chemin, char* Nom_Fichier)
{
int i=0, Position_Du_Dernier_Slash=0;
do
{
Chemin[i]=Buffer[i];
if (Buffer[i]=='/')
Position_Du_Dernier_Slash=i;
i++;
}while (Buffer[i]!=0);
i=Position_Du_Dernier_Slash+1;
Chemin[i]=0;
strcpy(Nom_Fichier,Buffer+i);
}
int filelength(int fichier)
{
struct stat infos_fichier;

View File

@ -3,9 +3,6 @@
#ifdef __linux__
void _splitpath(char* Buffer, char* Chemin, char* Nom_Fichier);
/* Sépare dans la chaîne passée dans Buffer le chemin d'accès du nom de fichier */
struct find_t {
unsigned char attrib;
char name[256];

40
main.c
View File

@ -24,6 +24,7 @@
#include "readini.h"
#include "saveini.h"
#include "linux.h"
#include "io.h"
#ifndef __linux__
#include <windows.h>
@ -215,34 +216,17 @@ void Analyse_de_la_ligne_de_commande(int argc,char * argv[])
// On récupère le chemin complet du paramètre
// Et on découpe ce chemin en répertoire(path) + fichier(.ext)
#ifdef __linux__
Buffer=realpath(argv[1],NULL);
_splitpath(Buffer,Principal_Repertoire_fichier,Principal_Nom_fichier);
Buffer=realpath(argv[1],NULL);
#else
Buffer = malloc(TAILLE_CHEMIN_FICHIER);
_fullpath(Buffer,argv[1],TAILLE_CHEMIN_FICHIER);
{
// Découpage du nom canonique de fichier en chemin + nom.
// On croirait que c'est du classique pour la LibC, mais non...
int i;
int PosDernierSeparateur = 0;
for (i=0; Buffer[i]!='\0'; i++)
{
Principal_Repertoire_fichier[i] = Buffer[i];
if (Buffer[i]=='\\')
PosDernierSeparateur = i;
}
Principal_Repertoire_fichier[PosDernierSeparateur]='\0';
for (i=0; Buffer[PosDernierSeparateur + i + 1]!='\0'; i++)
{
Principal_Nom_fichier[i] = Buffer[PosDernierSeparateur + i + 1];
}
Principal_Nom_fichier[i]='\0';
}
free(Buffer);
Buffer = malloc(TAILLE_CHEMIN_FICHIER);
_fullpath(Buffer,argv[1],TAILLE_CHEMIN_FICHIER);
#endif
// chdir(Principal_Repertoire_fichier);
Extraire_chemin(Principal_Repertoire_fichier, Buffer);
Extraire_nom_fichier(Principal_Nom_fichier, Buffer);
#ifndef __linux__
free(Buffer);
#endif
chdir(Principal_Repertoire_fichier);
}
else
{
@ -309,6 +293,7 @@ void Initialisation_du_programme(int argc,char * argv[])
// On détermine dès le départ où se trouve le fichier:
Chercher_repertoire_du_programme(argv[0]);
// On détecte les lecteurs qui sont accessibles:
Rechercher_drives();
// On détermine le répertoire courant:
@ -630,9 +615,6 @@ void Fermeture_du_programme(void)
// On prend bien soin de passer dans le répertoire initial:
if (chdir(Repertoire_initial)!=-1)
{
/* A revoir ...
_dos_setdrive(Repertoire_initial[0]-64,&Bidon);
*/
// On sauvegarde les données dans le .CFG et dans le .INI
if (Config.Auto_save)
{