diff --git a/init.c b/init.c index 5f11bc5a..3dee0aca 100644 --- a/init.c +++ b/init.c @@ -1,15 +1,15 @@ -#define TAILLE_FICHIER_DATA 84369 // Taille du fichier GFX2.DAT - -#include -#include "const.h" -#include "struct.h" -#include "global.h" -#include "modesvdo.h" -#include "graph.h" -#include "boutons.h" -#include "palette.h" -#include "aide.h" -#include "operatio.h" +#define TAILLE_FICHIER_DATA 84369 // Taille du fichier GFX2.DAT + +#include +#include "const.h" +#include "struct.h" +#include "global.h" +#include "modesvdo.h" +#include "graph.h" +#include "boutons.h" +#include "palette.h" +#include "aide.h" +#include "operatio.h" #include #include @@ -21,223 +21,225 @@ #include "divers.h" #include "errno.h" +#include +#include // On déclare méchamment le prototype de Erreur pour éviter de faire un // fichier "main.h": void Erreur(int Code); - -// Chercher le répertoire contenant GFX2.EXE -void Chercher_repertoire_du_programme(char * Chaine) -{ - /*int Position; - - strcpy(Repertoire_du_programme,Chaine); - for (Position=strlen(Repertoire_du_programme);Repertoire_du_programme[Position]!='/';Position--); //sous linux c'est un /, sous windows c'est \\ + +// Chercher le répertoire contenant GFX2.EXE +void Chercher_repertoire_du_programme(char * Chaine) +{ + /*int Position; + + strcpy(Repertoire_du_programme,Chaine); + for (Position=strlen(Repertoire_du_programme);Repertoire_du_programme[Position]!='/';Position--); //sous linux c'est un /, sous windows c'est \\ Repertoire_du_programme[Position+1]='\0';*/ puts("Chercher_repertoire_du_programme: implémentation incomplète"); - Repertoire_du_programme[0]=0; //On va travailler dans le dossier courant ... -} - - -word Drive_Touche[26]= -{ - 0x041E, - 0x0430, - 0x042E, - 0x0420, - 0x0412, - 0x0421, - 0x0422, - 0x0423, - 0x0417, - 0x0424, - 0x0425, - 0x0426, - 0x0432, - 0x0431, - 0x0418, - 0x0419, - 0x0410, - 0x0413, - 0x041F, - 0x0414, - 0x0416, - 0x042F, - 0x0411, - 0x042D, - 0x0415, - 0x042C -}; -// Ajouter un lecteur à la liste de lecteurs -void Ajouter_lecteur(byte Numero, byte Type) -{ - Drive[Nb_drives].Lettre=Numero+65; - Drive[Nb_drives].Type =Type; - Drive[Nb_drives].Touche=Drive_Touche[Numero]; - - Nb_drives++; -} - - -// Rechercher la liste et le type des lecteurs de la machine -void Rechercher_drives(void) + Repertoire_du_programme[0]=0; //On va travailler dans le dossier courant ... +} + + +word Drive_Touche[26]= { -/* - byte Lecteur; - byte Nb_lecteurs_disquettes; - byte Lecteur_de_disquettes; - byte Type_de_lecteur=42; - //char Bidon[256]; - - Nb_drives=0; - Nb_lecteurs_disquettes=(Type_de_lecteur_de_disquette(0)>0)+(Type_de_lecteur_de_disquette(1)>0); - - // Test du type des lecteurs A: et B: - if (Nb_lecteurs_disquettes==2) - for (Lecteur=0; Lecteur<=1; Lecteur++) - { - switch (Type_de_lecteur_de_disquette(Lecteur)) - { - case 1 : - case 2 : - Ajouter_lecteur(Lecteur,DRIVE_FLOPPY_5_25); - break; - default: - Ajouter_lecteur(Lecteur,DRIVE_FLOPPY_3_5); - } - } - else // On n'a pas 2 lecteurs donc on regarde si "logiquement" c'est A: ou B: - if (Nb_lecteurs_disquettes==1) - { - if (Disk_map(2)==Disk_map(1)) - { - // Il n'y a pas de lecteur émulé par un SUBST - Lecteur_de_disquettes=Disk_map(1)-1; - for (Lecteur=0; Lecteur<=1; Lecteur++) - { - switch (Type_de_lecteur_de_disquette(Lecteur)) - { - case 0 : - break; - case 1 : - case 2 : - Ajouter_lecteur(Lecteur_de_disquettes,DRIVE_FLOPPY_5_25); - break; - default: - Ajouter_lecteur(Lecteur_de_disquettes,DRIVE_FLOPPY_3_5); - } - } - } - else - { - // Il y a un lecteur émulé par un SUBST - Lecteur_de_disquettes=Disk_map(1)-1; - - // On cherche d'abord sur quel lecteur le lecteur physique est dispo - for (Lecteur=0; Lecteur<=1; Lecteur++) - { - switch (Type_de_lecteur_de_disquette(Lecteur)) - { - case 0 : - break; - case 1 : - case 2 : - Type_de_lecteur=DRIVE_FLOPPY_5_25; - break; - default: - Type_de_lecteur=DRIVE_FLOPPY_3_5; - } - } - - // On déclare les trucs maintenant - if (Lecteur_de_disquettes==0) - { - // Situation : On a un lecteur A: qui est réel et un lecteur B: émulé - Ajouter_lecteur(0,Type_de_lecteur); - Ajouter_lecteur(1,DRIVE_NETWORK); - } - else - { - // Situation : On a un lecteur A: qui est réel et un lecteur B: émulé - Ajouter_lecteur(0,DRIVE_NETWORK); - Ajouter_lecteur(1,Type_de_lecteur); - } - } - } - else - // Il n'y a pas de lecteur de D7 physique, mais on vérifie s'il n'y en a - // pas qui seraient émulés par SUBST - for (Lecteur=0; Lecteur<=1; Lecteur++) - { - switch (Freespace(Lecteur+1)) - { - case -1: - break; - default: - Ajouter_lecteur(Lecteur,DRIVE_NETWORK); - } - } - - // Test de la présence d'autres lecteurs (HDD, CD, Réseau) - // On les met tous en réseau avant de tester leur vrai type. - for (Lecteur=2; Lecteur<=25; Lecteur++) - { - if (Disque_dur_present(Lecteur-2)) - Ajouter_lecteur(Lecteur,DRIVE_HDD); - else - if (Lecteur_CDROM_present(Lecteur)) - Ajouter_lecteur(Lecteur,DRIVE_CDROM); - else - if (Freespace(Lecteur+1)!=-1) - Ajouter_lecteur(Lecteur,DRIVE_NETWORK); - } + 0x041E, + 0x0430, + 0x042E, + 0x0420, + 0x0412, + 0x0421, + 0x0422, + 0x0423, + 0x0417, + 0x0424, + 0x0425, + 0x0426, + 0x0432, + 0x0431, + 0x0418, + 0x0419, + 0x0410, + 0x0413, + 0x041F, + 0x0414, + 0x0416, + 0x042F, + 0x0411, + 0x042D, + 0x0415, + 0x042C +}; +// Ajouter un lecteur à la liste de lecteurs +void Ajouter_lecteur(byte Numero, byte Type) +{ + Drive[Nb_drives].Lettre=Numero+65; + Drive[Nb_drives].Type =Type; + Drive[Nb_drives].Touche=Drive_Touche[Numero]; + + Nb_drives++; +} + + +// Rechercher la liste et le type des lecteurs de la machine +void Rechercher_drives(void) +{ +/* + byte Lecteur; + byte Nb_lecteurs_disquettes; + byte Lecteur_de_disquettes; + byte Type_de_lecteur=42; + //char Bidon[256]; + + Nb_drives=0; + Nb_lecteurs_disquettes=(Type_de_lecteur_de_disquette(0)>0)+(Type_de_lecteur_de_disquette(1)>0); + + // Test du type des lecteurs A: et B: + if (Nb_lecteurs_disquettes==2) + for (Lecteur=0; Lecteur<=1; Lecteur++) + { + switch (Type_de_lecteur_de_disquette(Lecteur)) + { + case 1 : + case 2 : + Ajouter_lecteur(Lecteur,DRIVE_FLOPPY_5_25); + break; + default: + Ajouter_lecteur(Lecteur,DRIVE_FLOPPY_3_5); + } + } + else // On n'a pas 2 lecteurs donc on regarde si "logiquement" c'est A: ou B: + if (Nb_lecteurs_disquettes==1) + { + if (Disk_map(2)==Disk_map(1)) + { + // Il n'y a pas de lecteur émulé par un SUBST + Lecteur_de_disquettes=Disk_map(1)-1; + for (Lecteur=0; Lecteur<=1; Lecteur++) + { + switch (Type_de_lecteur_de_disquette(Lecteur)) + { + case 0 : + break; + case 1 : + case 2 : + Ajouter_lecteur(Lecteur_de_disquettes,DRIVE_FLOPPY_5_25); + break; + default: + Ajouter_lecteur(Lecteur_de_disquettes,DRIVE_FLOPPY_3_5); + } + } + } + else + { + // Il y a un lecteur émulé par un SUBST + Lecteur_de_disquettes=Disk_map(1)-1; + + // On cherche d'abord sur quel lecteur le lecteur physique est dispo + for (Lecteur=0; Lecteur<=1; Lecteur++) + { + switch (Type_de_lecteur_de_disquette(Lecteur)) + { + case 0 : + break; + case 1 : + case 2 : + Type_de_lecteur=DRIVE_FLOPPY_5_25; + break; + default: + Type_de_lecteur=DRIVE_FLOPPY_3_5; + } + } + + // On déclare les trucs maintenant + if (Lecteur_de_disquettes==0) + { + // Situation : On a un lecteur A: qui est réel et un lecteur B: émulé + Ajouter_lecteur(0,Type_de_lecteur); + Ajouter_lecteur(1,DRIVE_NETWORK); + } + else + { + // Situation : On a un lecteur A: qui est réel et un lecteur B: émulé + Ajouter_lecteur(0,DRIVE_NETWORK); + Ajouter_lecteur(1,Type_de_lecteur); + } + } + } + else + // Il n'y a pas de lecteur de D7 physique, mais on vérifie s'il n'y en a + // pas qui seraient émulés par SUBST + for (Lecteur=0; Lecteur<=1; Lecteur++) + { + switch (Freespace(Lecteur+1)) + { + case -1: + break; + default: + Ajouter_lecteur(Lecteur,DRIVE_NETWORK); + } + } + + // Test de la présence d'autres lecteurs (HDD, CD, Réseau) + // On les met tous en réseau avant de tester leur vrai type. + for (Lecteur=2; Lecteur<=25; Lecteur++) + { + if (Disque_dur_present(Lecteur-2)) + Ajouter_lecteur(Lecteur,DRIVE_HDD); + else + if (Lecteur_CDROM_present(Lecteur)) + Ajouter_lecteur(Lecteur,DRIVE_CDROM); + else + if (Freespace(Lecteur+1)!=-1) + Ajouter_lecteur(Lecteur,DRIVE_NETWORK); + } */ //Sous linux, il n'y a pas de lecteurs, on va juste mettre un disque dur qui pointera vers la racine -Ajouter_lecteur(0,DRIVE_HDD); //Le lecteur numéro 0 est un disque dur. -} - - -// Fonction de décryptage - - #define DECRYPT_TAILLE_CLE 14 - byte Decrypt_compteur=0; - char Decrypt_cle[DECRYPT_TAILLE_CLE]="Sunset Design"; - - byte Decrypt(byte Octet) - { - byte Temp; - - Temp=Octet ^ Decrypt_cle[Decrypt_compteur]; - if ((++Decrypt_compteur)>=(DECRYPT_TAILLE_CLE-1)) - Decrypt_compteur=0; - return Temp; - } - -// Décryptage d'une donnée - -void Decrypte(byte * Donnee,int Taille) -{ - int Indice; - - for (Indice=0;Indice=(DECRYPT_TAILLE_CLE-1)) + Decrypt_compteur=0; + return Temp; + } + +// Décryptage d'une donnée + +void Decrypte(byte * Donnee,int Taille) +{ + int Indice; + + for (Indice=0;Indice>Pos_X)) ? 1 : 0); - - // Lecture de la fonte alternative - if (read(Handle,Fonte_temporaire,2048)!=2048) - Erreur(ERREUR_DAT_CORROMPU); - Decrypte(Fonte_temporaire,2048); - for (Indice=0;Indice<256;Indice++) - for (Pos_X=0;Pos_X<8;Pos_X++) - for (Pos_Y=0;Pos_Y<8;Pos_Y++) - Fonte_fun[(Indice<<6)+(Pos_X<<3)+Pos_Y]=( ((*(Fonte_temporaire+(Indice*8)+Pos_Y))&(0x80>>Pos_X)) ? 1 : 0); - - free(Fonte_temporaire); - - Fonte=Fonte_systeme; - - // Lecture de la fonte 6x8: (spéciale aide) - if (read(Handle,Fonte_help,(315*6*8))!=(315*6*8)) - Erreur(ERREUR_DAT_CORROMPU); - Decrypte((byte*)Fonte_help,(315*6*8)); - - // Lecture des différentes sections de l'aide: - - // Pour chaque section "Indice" de l'aide: - for (Indice=0;Indice>1); - Pinceau_predefini_Decalage_Y[Indice]=(Pinceau_predefini_Hauteur[Indice]>>1); - } - - Curseur_Decalage_X[FORME_CURSEUR_FLECHE]=0; - Curseur_Decalage_Y[FORME_CURSEUR_FLECHE]=0; - - Curseur_Decalage_X[FORME_CURSEUR_CIBLE]=7; - Curseur_Decalage_Y[FORME_CURSEUR_CIBLE]=7; - - Curseur_Decalage_X[FORME_CURSEUR_CIBLE_PIPETTE]=7; - Curseur_Decalage_Y[FORME_CURSEUR_CIBLE_PIPETTE]=7; - - Curseur_Decalage_X[FORME_CURSEUR_SABLIER]=7; - Curseur_Decalage_Y[FORME_CURSEUR_SABLIER]=7; - - Curseur_Decalage_X[FORME_CURSEUR_MULTIDIRECTIONNEL]=7; - Curseur_Decalage_Y[FORME_CURSEUR_MULTIDIRECTIONNEL]=7; - - Curseur_Decalage_X[FORME_CURSEUR_HORIZONTAL]=7; - Curseur_Decalage_Y[FORME_CURSEUR_HORIZONTAL]=3; - - Curseur_Decalage_X[FORME_CURSEUR_CIBLE_FINE]=7; - Curseur_Decalage_Y[FORME_CURSEUR_CIBLE_FINE]=7; - - Curseur_Decalage_X[FORME_CURSEUR_CIBLE_PIPETTE_FINE]=7; - Curseur_Decalage_Y[FORME_CURSEUR_CIBLE_PIPETTE_FINE]=7; -} - - -// Initialisation des boutons: - - // Action factice: - -void Rien_du_tout(void) -{} - - // Initialiseur d'un bouton: - -void Initialiser_bouton(byte Numero, - word Decalage_X , word Decalage_Y, - word Largeur , word Hauteur, - byte Forme, - fonction_action Gauche , fonction_action Droite, - fonction_action Desenclencher, - byte Famille) -{ - Bouton[Numero].Decalage_X =Decalage_X; - Bouton[Numero].Decalage_Y =Decalage_Y; - Bouton[Numero].Largeur =Largeur-1; - Bouton[Numero].Hauteur =Hauteur-1; - Bouton[Numero].Enfonce =0; - Bouton[Numero].Forme =Forme; - Bouton[Numero].Gauche =Gauche; - Bouton[Numero].Droite =Droite; - Bouton[Numero].Desenclencher =Desenclencher; - Bouton[Numero].Famille =Famille; -} - - - // Initiliseur de tous les boutons: - -void Initialisation_des_boutons(void) -{ - byte Indice_bouton; - - for (Indice_bouton=0;Indice_bouton>Pos_X)) ? 1 : 0); + + // Lecture de la fonte alternative + if (read(Handle,Fonte_temporaire,2048)!=2048) + Erreur(ERREUR_DAT_CORROMPU); + Decrypte(Fonte_temporaire,2048); + for (Indice=0;Indice<256;Indice++) + for (Pos_X=0;Pos_X<8;Pos_X++) + for (Pos_Y=0;Pos_Y<8;Pos_Y++) + Fonte_fun[(Indice<<6)+(Pos_X<<3)+Pos_Y]=( ((*(Fonte_temporaire+(Indice*8)+Pos_Y))&(0x80>>Pos_X)) ? 1 : 0); + + free(Fonte_temporaire); + + Fonte=Fonte_systeme; + + // Lecture de la fonte 6x8: (spéciale aide) + if (read(Handle,Fonte_help,(315*6*8))!=(315*6*8)) + Erreur(ERREUR_DAT_CORROMPU); + Decrypte((byte*)Fonte_help,(315*6*8)); + + // Lecture des différentes sections de l'aide: + + // Pour chaque section "Indice" de l'aide: + for (Indice=0;Indice>1); + Pinceau_predefini_Decalage_Y[Indice]=(Pinceau_predefini_Hauteur[Indice]>>1); + } + + Curseur_Decalage_X[FORME_CURSEUR_FLECHE]=0; + Curseur_Decalage_Y[FORME_CURSEUR_FLECHE]=0; + + Curseur_Decalage_X[FORME_CURSEUR_CIBLE]=7; + Curseur_Decalage_Y[FORME_CURSEUR_CIBLE]=7; + + Curseur_Decalage_X[FORME_CURSEUR_CIBLE_PIPETTE]=7; + Curseur_Decalage_Y[FORME_CURSEUR_CIBLE_PIPETTE]=7; + + Curseur_Decalage_X[FORME_CURSEUR_SABLIER]=7; + Curseur_Decalage_Y[FORME_CURSEUR_SABLIER]=7; + + Curseur_Decalage_X[FORME_CURSEUR_MULTIDIRECTIONNEL]=7; + Curseur_Decalage_Y[FORME_CURSEUR_MULTIDIRECTIONNEL]=7; + + Curseur_Decalage_X[FORME_CURSEUR_HORIZONTAL]=7; + Curseur_Decalage_Y[FORME_CURSEUR_HORIZONTAL]=3; + + Curseur_Decalage_X[FORME_CURSEUR_CIBLE_FINE]=7; + Curseur_Decalage_Y[FORME_CURSEUR_CIBLE_FINE]=7; + + Curseur_Decalage_X[FORME_CURSEUR_CIBLE_PIPETTE_FINE]=7; + Curseur_Decalage_Y[FORME_CURSEUR_CIBLE_PIPETTE_FINE]=7; +} + + +// Initialisation des boutons: + + // Action factice: + +void Rien_du_tout(void) +{} + + // Initialiseur d'un bouton: + +void Initialiser_bouton(byte Numero, + word Decalage_X , word Decalage_Y, + word Largeur , word Hauteur, + byte Forme, + fonction_action Gauche , fonction_action Droite, + fonction_action Desenclencher, + byte Famille) +{ + Bouton[Numero].Decalage_X =Decalage_X; + Bouton[Numero].Decalage_Y =Decalage_Y; + Bouton[Numero].Largeur =Largeur-1; + Bouton[Numero].Hauteur =Hauteur-1; + Bouton[Numero].Enfonce =0; + Bouton[Numero].Forme =Forme; + Bouton[Numero].Gauche =Gauche; + Bouton[Numero].Droite =Droite; + Bouton[Numero].Desenclencher =Desenclencher; + Bouton[Numero].Famille =Famille; +} + + + // Initiliseur de tous les boutons: + +void Initialisation_des_boutons(void) +{ + byte Indice_bouton; + + for (Indice_bouton=0;Indice_bouton>8) - { - case 0 : Config_Touche[Ordonnancement[Indice2]&0xFF]=CFG_Infos_touche.Touche; break; - case 1 : Bouton[Ordonnancement[Indice2]&0xFF].Raccourci_gauche=CFG_Infos_touche.Touche; break; - case 2 : Bouton[Ordonnancement[Indice2]&0xFF].Raccourci_droite=CFG_Infos_touche.Touche; break; - } - } - else - goto Erreur_lecture_config; - } - } - } - else - { - if (lseek(Handle,Chunk.Taille,SEEK_CUR)==-1) - goto Erreur_lecture_config; - } - break; - case CHUNK_MODES_VIDEO: // Modes vidéo - if ((Chunk.Taille/sizeof(CFG_Mode_video))!=NB_MODES_VIDEO) - goto Erreur_lecture_config; - for (Indice=1; Indice<=NB_MODES_VIDEO; Indice++) - { - if (read(Handle,&CFG_Mode_video,sizeof(CFG_Mode_video))!=sizeof(CFG_Mode_video)) - goto Erreur_lecture_config; - else - { - for (Indice2=0; - ( (Indice2>6)) ) ); - Indice2++); - if (Indice2>8) - { - case 0 : CFG_Infos_touche.Touche=Config_Touche[Ordonnancement[Indice]&0xFF]; break; - case 1 : CFG_Infos_touche.Touche=Bouton[Ordonnancement[Indice]&0xFF].Raccourci_gauche; break; - case 2 : CFG_Infos_touche.Touche=Bouton[Ordonnancement[Indice]&0xFF].Raccourci_droite; break; - } - CFG_Infos_touche.Touche2=0x00FF; - if (write(Handle,&CFG_Infos_touche,sizeof(CFG_Infos_touche))!=sizeof(CFG_Infos_touche)) - goto Erreur_sauvegarde_config; - } - - // Sauvegarde de l'état de chaque mode vidéo - Chunk.Numero=CHUNK_MODES_VIDEO; - Chunk.Taille=NB_MODES_VIDEO*sizeof(CFG_Mode_video); - if (write(Handle,&Chunk,sizeof(Chunk))!=sizeof(Chunk)) - goto Erreur_sauvegarde_config; - for (Indice=0; Indice>8) + { + case 0 : Config_Touche[Ordonnancement[Indice2]&0xFF]=CFG_Infos_touche.Touche; break; + case 1 : Bouton[Ordonnancement[Indice2]&0xFF].Raccourci_gauche=CFG_Infos_touche.Touche; break; + case 2 : Bouton[Ordonnancement[Indice2]&0xFF].Raccourci_droite=CFG_Infos_touche.Touche; break; + } + } + else + goto Erreur_lecture_config; + } + } + } + else + { + if (lseek(Handle,Chunk.Taille,SEEK_CUR)==-1) + goto Erreur_lecture_config; + } + break; + case CHUNK_MODES_VIDEO: // Modes vidéo + if ((Chunk.Taille/5/*sizeof(CFG_Mode_video)*/)!=NB_MODES_VIDEO) + goto Erreur_lecture_config; + for (Indice=1; Indice<=NB_MODES_VIDEO; Indice++) + { + read(Handle,&(CFG_Mode_video.Etat),1); + read(Handle,&(CFG_Mode_video.Largeur),2); + if (read(Handle,&(CFG_Mode_video.Hauteur),2)!=2) + goto Erreur_lecture_config; + else + { + for (Indice2=0; + ( (Indice2>6)) ) ); + Indice2++); + if (Indice2>8) + { + case 0 : CFG_Infos_touche.Touche=Config_Touche[Ordonnancement[Indice]&0xFF]; break; + case 1 : CFG_Infos_touche.Touche=Bouton[Ordonnancement[Indice]&0xFF].Raccourci_gauche; break; + case 2 : CFG_Infos_touche.Touche=Bouton[Ordonnancement[Indice]&0xFF].Raccourci_droite; break; + } + CFG_Infos_touche.Touche2=0x00FF; + if (write(Handle,&CFG_Infos_touche,sizeof(CFG_Infos_touche))!=sizeof(CFG_Infos_touche)) + goto Erreur_sauvegarde_config; + } + + // Sauvegarde de l'état de chaque mode vidéo + Chunk.Numero=CHUNK_MODES_VIDEO; + Chunk.Taille=NB_MODES_VIDEO*sizeof(CFG_Mode_video); + if (write(Handle,&Chunk,sizeof(Chunk))!=sizeof(Chunk)) + goto Erreur_sauvegarde_config; + for (Indice=0; Indice='a') && (Indice<='z')) - Resultat+='A'-'a'; - - lowercase_to_uppercase[Indice]=Resultat; - } -} - - - -void Charger_INI_Clear_string(char * String) -{ - int Indice; - - for (Indice=0;String[Indice]!='\0';) - { - if ((String[Indice]==' ') || - (String[Indice]=='\t')) - { - // Suppression d'un espace ou d'un tab: - - strcpy(String+Indice,String+Indice+1); - } - else - if ((String[Indice]==';') || - (String[Indice]=='#') || - (String[Indice]=='\n')) - { - // Rencontre d'un commentaire ou d'un saut de ligne: - - String[Indice]='\0'; - } - else - { - // Passage en majuscule d'un caractère: - - String[Indice]=lowercase_to_uppercase[(int)String[Indice]]; - Indice++; - } - } -} - - - -int Charger_INI_Seek_pattern(char * Buffer,char * Pattern) -{ - int Indice_buffer; - int Indice_pattern; - - // A partir de chaque lettre de la chaîne Buffer - for (Indice_buffer=0;Buffer[Indice_buffer]!='\0';Indice_buffer++) - { - // On regarde si la chaîne Pattern est équivalente … la position courante - // de la chaîne Buffer: - for (Indice_pattern=0;(Pattern[Indice_pattern]!='\0') && (Buffer[Indice_buffer+Indice_pattern]==Pattern[Indice_pattern]);Indice_pattern++); - - // Si on a trouvé la chaîne Pattern dans la chaîne Buffer, on renvoie la - // position … laquelle on l'a trouvée (+1 pour que si on la trouve au - // début ‡a ne renvoie pas la mˆme chose que si on ne l'avait pas - // trouvée): - if (Pattern[Indice_pattern]=='\0') - return (Indice_buffer+1); - } - - // Si on ne l'a pas trouvée, on renvoie 0: - return 0; -} - - - -int Charger_INI_Reach_group(FILE * File,char * Buffer,char * Group) -{ - int Arret; - char * Group_upper; - char * Buffer_upper; - - // On alloue les zones de mémoire: - Group_upper=(char *)malloc(1024); - Buffer_upper=(char *)malloc(1024); - - // On commence par se faire une version majuscule du groupe … rechercher: - strcpy(Group_upper,Group); - Charger_INI_Clear_string(Group_upper); - - Arret=0; - do - { - // On lit une ligne dans le fichier: - if (fgets(Buffer,1024,File)==0) - { - free(Buffer_upper); - free(Group_upper); - return ERREUR_INI_CORROMPU; - } - - Ligne_INI++; - - // On s'en fait une version en majuscule: - strcpy(Buffer_upper,Buffer); - Charger_INI_Clear_string(Buffer_upper); - - // On compare la chaîne avec le groupe recherché: - Arret=Charger_INI_Seek_pattern(Buffer_upper,Group_upper); - } - while (!Arret); - - free(Buffer_upper); - free(Group_upper); - - return 0; -} - - - -int Charger_INI_Get_value(char * String,int * Index,int * Value) -{ - // On teste si la valeur actuelle est YES (ou Y): - - if (Charger_INI_Seek_pattern(String+(*Index),"YES,")==1) - { - (*Value)=1; - (*Index)+=4; - return 0; - } - else - if (strcmp(String+(*Index),"YES")==0) - { - (*Value)=1; - (*Index)+=3; - return 0; - } - else - if (Charger_INI_Seek_pattern(String+(*Index),"Y,")==1) - { - (*Value)=1; - (*Index)+=2; - return 0; - } - else - if (strcmp(String+(*Index),"Y")==0) - { - (*Value)=1; - (*Index)+=1; - return 0; - } - else - - // On teste si la valeur actuelle est NO (ou N): - - if (Charger_INI_Seek_pattern(String+(*Index),"NO,")==1) - { - (*Value)=0; - (*Index)+=3; - return 0; - } - else - if (strcmp(String+(*Index),"NO")==0) - { - (*Value)=0; - (*Index)+=2; - return 0; - } - else - if (Charger_INI_Seek_pattern(String+(*Index),"N,")==1) - { - (*Value)=0; - (*Index)+=2; - return 0; - } - else - if (strcmp(String+(*Index),"N")==0) - { - (*Value)=0; - (*Index)+=1; - return 0; - } - else - if (String[*Index]=='$') - { - (*Value)=0; - - for (;;) - { - (*Index)++; - - if ((String[*Index]>='0') && (String[*Index]<='9')) - (*Value)=((*Value)*16)+String[*Index]-'0'; - else - if ((String[*Index]>='A') && (String[*Index]<='F')) - (*Value)=((*Value)*16)+String[*Index]-'A'+10; - else - if (String[*Index]==',') - { - (*Index)++; - return 0; - } - else - if (String[*Index]=='\0') - return 0; - else - return ERREUR_INI_CORROMPU; - } - } - else - if ((String[*Index]>='0') && (String[*Index]<='9')) - { - (*Value)=0; - - for (;;) - { - if ((String[*Index]>='0') && (String[*Index]<='9')) - (*Value)=((*Value)*10)+String[*Index]-'0'; - else - if (String[*Index]==',') - { - (*Index)++; - return 0; - } - else - if (String[*Index]=='\0') - return 0; - else - return ERREUR_INI_CORROMPU; - - (*Index)++; - } - } - else - return ERREUR_INI_CORROMPU; -} - - - -int Charger_INI_Get_values(FILE * File,char * Buffer,char * Option,int Nb_values_expected,int * Values) -{ - int Arret; - char * Option_upper; - char * Buffer_upper; - int Indice_buffer; - int Nb_valeurs; - - // On alloue les zones de mémoire: - Option_upper=(char *)malloc(1024); - Buffer_upper=(char *)malloc(1024); - - // On commence par se faire une version majuscule de l'option … rechercher: - strcpy(Option_upper,Option); - Charger_INI_Clear_string(Option_upper); - - Arret=0; - do - { - // On lit une ligne dans le fichier: - if (fgets(Buffer,1024,File)==0) - { - free(Buffer_upper); - free(Option_upper); - return ERREUR_INI_CORROMPU; - } - - Ligne_INI++; - - // On s'en fait une version en majuscule: - strcpy(Buffer_upper,Buffer); - Charger_INI_Clear_string(Buffer_upper); - - // On compare la chaîne avec l'option recherchée: - Arret=Charger_INI_Seek_pattern(Buffer_upper,Option_upper); - - // Si on l'a trouvée: - if (Arret) - { - Nb_valeurs=0; - - // On se positionne juste après la chaîne "=" - Indice_buffer=Charger_INI_Seek_pattern(Buffer_upper,"="); - - // Tant qu'on a pas atteint la fin de la ligne - while (Buffer_upper[Indice_buffer]!='\0') - { - if (Charger_INI_Get_value(Buffer_upper,&Indice_buffer,Values+Nb_valeurs)) - { - free(Buffer_upper); - free(Option_upper); - return ERREUR_INI_CORROMPU; - } - - if ( ((++Nb_valeurs) == Nb_values_expected) && - (Buffer_upper[Indice_buffer]!='\0') ) - { - free(Buffer_upper); - free(Option_upper); - return ERREUR_INI_CORROMPU; - } - } - if (Nb_valeurs255)) - goto Erreur_ERREUR_INI_CORROMPU; - Conf->Indice_Sensibilite_souris_X=Valeurs[0]; - - if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Y_sensitivity",1,Valeurs))) - goto Erreur_Retour; - if ((Valeurs[0]<1) || (Valeurs[0]>255)) - goto Erreur_ERREUR_INI_CORROMPU; - Conf->Indice_Sensibilite_souris_Y=Valeurs[0]; - - if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"X_correction_factor",1,Valeurs))) - goto Erreur_Retour; - if ((Valeurs[0]<0) || (Valeurs[0]>4)) - goto Erreur_ERREUR_INI_CORROMPU; - Conf->Mouse_Facteur_de_correction_X=Mouse_Facteur_de_correction_X=Valeurs[0]; - - if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Y_correction_factor",1,Valeurs))) - goto Erreur_Retour; - if ((Valeurs[0]<0) || (Valeurs[0]>4)) - goto Erreur_ERREUR_INI_CORROMPU; - Conf->Mouse_Facteur_de_correction_Y=Mouse_Facteur_de_correction_Y=Valeurs[0]; - - if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Cursor_aspect",1,Valeurs))) - goto Erreur_Retour; - if ((Valeurs[0]<1) || (Valeurs[0]>3)) - goto Erreur_ERREUR_INI_CORROMPU; - Conf->Curseur=Valeurs[0]-1; - - - if ((Retour=Charger_INI_Reach_group(Fichier,Buffer,"[MENU]"))) - goto Erreur_Retour; - - Conf->Coul_menu_pref[0].R=0; - Conf->Coul_menu_pref[0].V=0; - Conf->Coul_menu_pref[0].B=0; - Conf->Coul_menu_pref[3].R=63; - Conf->Coul_menu_pref[3].V=63; - Conf->Coul_menu_pref[3].B=63; - - if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Light_color",3,Valeurs))) - goto Erreur_Retour; - if ((Valeurs[0]<0) || (Valeurs[0]>63)) - goto Erreur_ERREUR_INI_CORROMPU; - if ((Valeurs[1]<0) || (Valeurs[1]>63)) - goto Erreur_ERREUR_INI_CORROMPU; - if ((Valeurs[2]<0) || (Valeurs[2]>63)) - goto Erreur_ERREUR_INI_CORROMPU; - Conf->Coul_menu_pref[2].R=Valeurs[0]; - Conf->Coul_menu_pref[2].V=Valeurs[1]; - Conf->Coul_menu_pref[2].B=Valeurs[2]; - - if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Dark_color",3,Valeurs))) - goto Erreur_Retour; - if ((Valeurs[0]<0) || (Valeurs[0]>63)) - goto Erreur_ERREUR_INI_CORROMPU; - if ((Valeurs[1]<0) || (Valeurs[1]>63)) - goto Erreur_ERREUR_INI_CORROMPU; - if ((Valeurs[2]<0) || (Valeurs[2]>63)) - goto Erreur_ERREUR_INI_CORROMPU; - Conf->Coul_menu_pref[1].R=Valeurs[0]; - Conf->Coul_menu_pref[1].V=Valeurs[1]; - Conf->Coul_menu_pref[1].B=Valeurs[2]; - - if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Menu_ratio",1,Valeurs))) - goto Erreur_Retour; - if ((Valeurs[0]<0) || (Valeurs[0]>2)) - goto Erreur_ERREUR_INI_CORROMPU; - Conf->Ratio=Valeurs[0]; - - if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Font",1,Valeurs))) - goto Erreur_Retour; - if ((Valeurs[0]<1) || (Valeurs[0]>2)) - goto Erreur_ERREUR_INI_CORROMPU; - Conf->Fonte=Valeurs[0]-1; - - - if ((Retour=Charger_INI_Reach_group(Fichier,Buffer,"[FILE_SELECTOR]"))) - goto Erreur_Retour; - - if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Show_hidden_files",1,Valeurs))) - goto Erreur_Retour; - if ((Valeurs[0]<0) || (Valeurs[0]>1)) - goto Erreur_ERREUR_INI_CORROMPU; - Conf->Lire_les_fichiers_caches=Valeurs[0]?-1:0; - - if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Show_hidden_directories",1,Valeurs))) - goto Erreur_Retour; - if ((Valeurs[0]<0) || (Valeurs[0]>1)) - goto Erreur_ERREUR_INI_CORROMPU; - Conf->Lire_les_repertoires_caches=Valeurs[0]?-1:0; - - if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Show_system_directories",1,Valeurs))) - goto Erreur_Retour; - if ((Valeurs[0]<0) || (Valeurs[0]>1)) - goto Erreur_ERREUR_INI_CORROMPU; - Conf->Lire_les_repertoires_systemes=Valeurs[0]?-1:0; - - if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Preview_delay",1,Valeurs))) - goto Erreur_Retour; - if ((Valeurs[0]<1) || (Valeurs[0]>256)) - goto Erreur_ERREUR_INI_CORROMPU; - Conf->Chrono_delay=Valeurs[0]; - - if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Maximize_preview",1,Valeurs))) - goto Erreur_Retour; - if ((Valeurs[0]<0) || (Valeurs[0]>1)) - goto Erreur_ERREUR_INI_CORROMPU; - Conf->Maximize_preview=Valeurs[0]; - - if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Find_file_fast",1,Valeurs))) - goto Erreur_Retour; - if ((Valeurs[0]<0) || (Valeurs[0]>2)) - goto Erreur_ERREUR_INI_CORROMPU; - Conf->Find_file_fast=Valeurs[0]; - - - if ((Retour=Charger_INI_Reach_group(Fichier,Buffer,"[LOADING]"))) - goto Erreur_Retour; - - if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Auto_set_resolution",1,Valeurs))) - goto Erreur_Retour; - if ((Valeurs[0]<0) || (Valeurs[0]>1)) - goto Erreur_ERREUR_INI_CORROMPU; - Conf->Auto_set_res=Valeurs[0]; - - if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Set_resolution_according_to",1,Valeurs))) - goto Erreur_Retour; - if ((Valeurs[0]<1) || (Valeurs[0]>2)) - goto Erreur_ERREUR_INI_CORROMPU; - Conf->Set_resolution_according_to=Valeurs[0]; - - if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Clear_palette",1,Valeurs))) - goto Erreur_Retour; - if ((Valeurs[0]<0) || (Valeurs[0]>1)) - goto Erreur_ERREUR_INI_CORROMPU; - Conf->Clear_palette=Valeurs[0]; - - - if ((Retour=Charger_INI_Reach_group(Fichier,Buffer,"[MISCELLANEOUS]"))) - goto Erreur_Retour; - - if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Draw_limits",1,Valeurs))) - goto Erreur_Retour; - if ((Valeurs[0]<0) || (Valeurs[0]>1)) - goto Erreur_ERREUR_INI_CORROMPU; - Conf->Afficher_limites_image=Valeurs[0]; - - if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Adjust_brush_pick",1,Valeurs))) - goto Erreur_Retour; - if ((Valeurs[0]<0) || (Valeurs[0]>1)) - goto Erreur_ERREUR_INI_CORROMPU; - Conf->Adjust_brush_pick=Valeurs[0]; - - if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Coordinates",1,Valeurs))) - goto Erreur_Retour; - if ((Valeurs[0]<1) || (Valeurs[0]>2)) - goto Erreur_ERREUR_INI_CORROMPU; - Conf->Coords_rel=2-Valeurs[0]; - - if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Backup",1,Valeurs))) - goto Erreur_Retour; - if ((Valeurs[0]<0) || (Valeurs[0]>1)) - goto Erreur_ERREUR_INI_CORROMPU; - Conf->Backup=Valeurs[0]; - - if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Undo_pages",1,Valeurs))) - goto Erreur_Retour; - if ((Valeurs[0]<1) || (Valeurs[0]>99)) - goto Erreur_ERREUR_INI_CORROMPU; - Conf->Nb_pages_Undo=Valeurs[0]; - - if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Gauges_scrolling_speed_Left",1,Valeurs))) - goto Erreur_Retour; - if ((Valeurs[0]<1) || (Valeurs[0]>255)) - goto Erreur_ERREUR_INI_CORROMPU; - Conf->Valeur_tempo_jauge_gauche=Valeurs[0]; - - if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Gauges_scrolling_speed_Right",1,Valeurs))) - goto Erreur_Retour; - if ((Valeurs[0]<1) || (Valeurs[0]>255)) - goto Erreur_ERREUR_INI_CORROMPU; - Conf->Valeur_tempo_jauge_droite=Valeurs[0]; - - if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Auto_save",1,Valeurs))) - goto Erreur_Retour; - if ((Valeurs[0]<0) || (Valeurs[0]>1)) - goto Erreur_ERREUR_INI_CORROMPU; - Conf->Auto_save=Valeurs[0]; - - if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Vertices_per_polygon",1,Valeurs))) - goto Erreur_Retour; - if ((Valeurs[0]<2) || (Valeurs[0]>16384)) - goto Erreur_ERREUR_INI_CORROMPU; - Conf->Nb_max_de_vertex_par_polygon=Valeurs[0]; - - if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Fast_zoom",1,Valeurs))) - goto Erreur_Retour; - if ((Valeurs[0]<0) || (Valeurs[0]>1)) - goto Erreur_ERREUR_INI_CORROMPU; - Conf->Fast_zoom=Valeurs[0]; - - if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Separate_colors",1,Valeurs))) - goto Erreur_Retour; - if ((Valeurs[0]<0) || (Valeurs[0]>1)) - goto Erreur_ERREUR_INI_CORROMPU; - Conf->Couleurs_separees=Valeurs[0]; - - if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"FX_feedback",1,Valeurs))) - goto Erreur_Retour; - if ((Valeurs[0]<0) || (Valeurs[0]>1)) - goto Erreur_ERREUR_INI_CORROMPU; - Conf->FX_Feedback=Valeurs[0]; - - if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Safety_colors",1,Valeurs))) - goto Erreur_Retour; - if ((Valeurs[0]<0) || (Valeurs[0]>1)) - goto Erreur_ERREUR_INI_CORROMPU; - Conf->Safety_colors=Valeurs[0]; - - if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Opening_message",1,Valeurs))) - goto Erreur_Retour; - if ((Valeurs[0]<0) || (Valeurs[0]>1)) - goto Erreur_ERREUR_INI_CORROMPU; - Conf->Opening_message=Valeurs[0]; - - if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Clear_with_stencil",1,Valeurs))) - goto Erreur_Retour; - if ((Valeurs[0]<0) || (Valeurs[0]>1)) - goto Erreur_ERREUR_INI_CORROMPU; - Conf->Clear_with_stencil=Valeurs[0]; - - if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Auto_discontinuous",1,Valeurs))) - goto Erreur_Retour; - if ((Valeurs[0]<0) || (Valeurs[0]>1)) - goto Erreur_ERREUR_INI_CORROMPU; - Conf->Auto_discontinuous=Valeurs[0]; - - if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Save_screen_size_in_GIF",1,Valeurs))) - goto Erreur_Retour; - if ((Valeurs[0]<0) || (Valeurs[0]>1)) - goto Erreur_ERREUR_INI_CORROMPU; - Conf->Taille_ecran_dans_GIF=Valeurs[0]; - - if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Auto_nb_colors_used",1,Valeurs))) - goto Erreur_Retour; - if ((Valeurs[0]<0) || (Valeurs[0]>1)) - goto Erreur_ERREUR_INI_CORROMPU; - Conf->Auto_nb_used=Valeurs[0]; - - if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Default_video_mode",1,Valeurs))) - goto Erreur_Retour; - if ((Valeurs[0]MODE_1024_768)) - goto Erreur_ERREUR_INI_CORROMPU; - Conf->Resolution_par_defaut=Valeurs[0]; - - fclose(Fichier); - } - else - { - free(Nom_du_fichier); - free(Buffer); - return ERREUR_INI_ABSENT; - } - - free(Nom_du_fichier); - free(Buffer); - return 0; - - // Gestion des erreurs: - - Erreur_Retour: - - fclose(Fichier); - free(Nom_du_fichier); - free(Buffer); - return Retour; - - Erreur_ERREUR_INI_CORROMPU: - - fclose(Fichier); - free(Nom_du_fichier); - free(Buffer); - return ERREUR_INI_CORROMPU; -} +char lowercase_to_uppercase[256]; + + + +void Calculer_la_table_lowercase_to_uppercase(void) +{ + int Indice; + int Resultat; + + for (Indice=0;Indice<256;Indice++) + { + Resultat=Indice; + + if ((Indice>='a') && (Indice<='z')) + Resultat+='A'-'a'; + + lowercase_to_uppercase[Indice]=Resultat; + } +} + + + +void Charger_INI_Clear_string(char * String) +{ + int Indice; + + for (Indice=0;String[Indice]!='\0';) + { + if ((String[Indice]==' ') || + (String[Indice]=='\t')) + { + // Suppression d'un espace ou d'un tab: + + strcpy(String+Indice,String+Indice+1); + } + else + if ((String[Indice]==';') || + (String[Indice]=='#') || + (String[Indice]=='\n')) + { + // Rencontre d'un commentaire ou d'un saut de ligne: + + String[Indice]='\0'; + } + else + { + // Passage en majuscule d'un caractère: + + String[Indice]=lowercase_to_uppercase[(int)String[Indice]]; + Indice++; + } + } +} + + + +int Charger_INI_Seek_pattern(char * Buffer,char * Pattern) +{ + int Indice_buffer; + int Indice_pattern; + + // A partir de chaque lettre de la chaîne Buffer + for (Indice_buffer=0;Buffer[Indice_buffer]!='\0';Indice_buffer++) + { + // On regarde si la chaîne Pattern est équivalente … la position courante + // de la chaîne Buffer: + for (Indice_pattern=0;(Pattern[Indice_pattern]!='\0') && (Buffer[Indice_buffer+Indice_pattern]==Pattern[Indice_pattern]);Indice_pattern++); + + // Si on a trouvé la chaîne Pattern dans la chaîne Buffer, on renvoie la + // position … laquelle on l'a trouvée (+1 pour que si on la trouve au + // début ‡a ne renvoie pas la mˆme chose que si on ne l'avait pas + // trouvée): + if (Pattern[Indice_pattern]=='\0') + return (Indice_buffer+1); + } + + // Si on ne l'a pas trouvée, on renvoie 0: + return 0; +} + + + +int Charger_INI_Reach_group(FILE * File,char * Buffer,char * Group) +{ + int Arret; + char * Group_upper; + char * Buffer_upper; + + // On alloue les zones de mémoire: + Group_upper=(char *)malloc(1024); + Buffer_upper=(char *)malloc(1024); + + // On commence par se faire une version majuscule du groupe … rechercher: + strcpy(Group_upper,Group); + Charger_INI_Clear_string(Group_upper); + + Arret=0; + do + { + // On lit une ligne dans le fichier: + if (fgets(Buffer,1024,File)==0) + { + free(Buffer_upper); + free(Group_upper); + return ERREUR_INI_CORROMPU; + } + + Ligne_INI++; + + // On s'en fait une version en majuscule: + strcpy(Buffer_upper,Buffer); + Charger_INI_Clear_string(Buffer_upper); + + // On compare la chaîne avec le groupe recherché: + Arret=Charger_INI_Seek_pattern(Buffer_upper,Group_upper); + } + while (!Arret); + + free(Buffer_upper); + free(Group_upper); + + return 0; +} + + + +int Charger_INI_Get_value(char * String,int * Index,int * Value) +{ + // On teste si la valeur actuelle est YES (ou Y): + + if (Charger_INI_Seek_pattern(String+(*Index),"YES,")==1) + { + (*Value)=1; + (*Index)+=4; + return 0; + } + else + if (strcmp(String+(*Index),"YES")==0) + { + (*Value)=1; + (*Index)+=3; + return 0; + } + else + if (Charger_INI_Seek_pattern(String+(*Index),"Y,")==1) + { + (*Value)=1; + (*Index)+=2; + return 0; + } + else + if (strcmp(String+(*Index),"Y")==0) + { + (*Value)=1; + (*Index)+=1; + return 0; + } + else + + // On teste si la valeur actuelle est NO (ou N): + + if (Charger_INI_Seek_pattern(String+(*Index),"NO,")==1) + { + (*Value)=0; + (*Index)+=3; + return 0; + } + else + if (strcmp(String+(*Index),"NO")==0) + { + (*Value)=0; + (*Index)+=2; + return 0; + } + else + if (Charger_INI_Seek_pattern(String+(*Index),"N,")==1) + { + (*Value)=0; + (*Index)+=2; + return 0; + } + else + if (strcmp(String+(*Index),"N")==0) + { + (*Value)=0; + (*Index)+=1; + return 0; + } + else + if (String[*Index]=='$') + { + (*Value)=0; + + for (;;) + { + (*Index)++; + + if ((String[*Index]>='0') && (String[*Index]<='9')) + (*Value)=((*Value)*16)+String[*Index]-'0'; + else + if ((String[*Index]>='A') && (String[*Index]<='F')) + (*Value)=((*Value)*16)+String[*Index]-'A'+10; + else + if (String[*Index]==',') + { + (*Index)++; + return 0; + } + else + if (String[*Index]=='\0') + return 0; + else + return ERREUR_INI_CORROMPU; + } + } + else + if ((String[*Index]>='0') && (String[*Index]<='9')) + { + (*Value)=0; + + for (;;) + { + if ((String[*Index]>='0') && (String[*Index]<='9')) + (*Value)=((*Value)*10)+String[*Index]-'0'; + else + if (String[*Index]==',') + { + (*Index)++; + return 0; + } + else + if (String[*Index]=='\0') + return 0; + else + return ERREUR_INI_CORROMPU; + + (*Index)++; + } + } + else + return ERREUR_INI_CORROMPU; +} + + + +int Charger_INI_Get_values(FILE * File,char * Buffer,char * Option,int Nb_values_expected,int * Values) +{ + int Arret; + char * Option_upper; + char * Buffer_upper; + int Indice_buffer; + int Nb_valeurs; + + // On alloue les zones de mémoire: + Option_upper=(char *)malloc(1024); + Buffer_upper=(char *)malloc(1024); + + // On commence par se faire une version majuscule de l'option … rechercher: + strcpy(Option_upper,Option); + Charger_INI_Clear_string(Option_upper); + + Arret=0; + do + { + // On lit une ligne dans le fichier: + if (fgets(Buffer,1024,File)==0) + { + free(Buffer_upper); + free(Option_upper); + return ERREUR_INI_CORROMPU; + } + + Ligne_INI++; + + // On s'en fait une version en majuscule: + strcpy(Buffer_upper,Buffer); + Charger_INI_Clear_string(Buffer_upper); + + // On compare la chaîne avec l'option recherchée: + Arret=Charger_INI_Seek_pattern(Buffer_upper,Option_upper); + + // Si on l'a trouvée: + if (Arret) + { + Nb_valeurs=0; + + // On se positionne juste après la chaîne "=" + Indice_buffer=Charger_INI_Seek_pattern(Buffer_upper,"="); + + // Tant qu'on a pas atteint la fin de la ligne + while (Buffer_upper[Indice_buffer]!='\0') + { + if (Charger_INI_Get_value(Buffer_upper,&Indice_buffer,Values+Nb_valeurs)) + { + free(Buffer_upper); + free(Option_upper); + return ERREUR_INI_CORROMPU; + } + + if ( ((++Nb_valeurs) == Nb_values_expected) && + (Buffer_upper[Indice_buffer]!='\0') ) + { + free(Buffer_upper); + free(Option_upper); + return ERREUR_INI_CORROMPU; + } + } + if (Nb_valeurs255)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->Indice_Sensibilite_souris_X=Valeurs[0]; + + if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Y_sensitivity",1,Valeurs))) + goto Erreur_Retour; + if ((Valeurs[0]<1) || (Valeurs[0]>255)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->Indice_Sensibilite_souris_Y=Valeurs[0]; + + if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"X_correction_factor",1,Valeurs))) + goto Erreur_Retour; + if ((Valeurs[0]<0) || (Valeurs[0]>4)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->Mouse_Facteur_de_correction_X=Mouse_Facteur_de_correction_X=Valeurs[0]; + + if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Y_correction_factor",1,Valeurs))) + goto Erreur_Retour; + if ((Valeurs[0]<0) || (Valeurs[0]>4)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->Mouse_Facteur_de_correction_Y=Mouse_Facteur_de_correction_Y=Valeurs[0]; + + if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Cursor_aspect",1,Valeurs))) + goto Erreur_Retour; + if ((Valeurs[0]<1) || (Valeurs[0]>3)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->Curseur=Valeurs[0]-1; + + + if ((Retour=Charger_INI_Reach_group(Fichier,Buffer,"[MENU]"))) + goto Erreur_Retour; + + Conf->Coul_menu_pref[0].R=0; + Conf->Coul_menu_pref[0].V=0; + Conf->Coul_menu_pref[0].B=0; + Conf->Coul_menu_pref[3].R=63; + Conf->Coul_menu_pref[3].V=63; + Conf->Coul_menu_pref[3].B=63; + + if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Light_color",3,Valeurs))) + goto Erreur_Retour; + if ((Valeurs[0]<0) || (Valeurs[0]>63)) + goto Erreur_ERREUR_INI_CORROMPU; + if ((Valeurs[1]<0) || (Valeurs[1]>63)) + goto Erreur_ERREUR_INI_CORROMPU; + if ((Valeurs[2]<0) || (Valeurs[2]>63)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->Coul_menu_pref[2].R=Valeurs[0]; + Conf->Coul_menu_pref[2].V=Valeurs[1]; + Conf->Coul_menu_pref[2].B=Valeurs[2]; + + if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Dark_color",3,Valeurs))) + goto Erreur_Retour; + if ((Valeurs[0]<0) || (Valeurs[0]>63)) + goto Erreur_ERREUR_INI_CORROMPU; + if ((Valeurs[1]<0) || (Valeurs[1]>63)) + goto Erreur_ERREUR_INI_CORROMPU; + if ((Valeurs[2]<0) || (Valeurs[2]>63)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->Coul_menu_pref[1].R=Valeurs[0]; + Conf->Coul_menu_pref[1].V=Valeurs[1]; + Conf->Coul_menu_pref[1].B=Valeurs[2]; + + if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Menu_ratio",1,Valeurs))) + goto Erreur_Retour; + if ((Valeurs[0]<0) || (Valeurs[0]>2)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->Ratio=Valeurs[0]; + + if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Font",1,Valeurs))) + goto Erreur_Retour; + if ((Valeurs[0]<1) || (Valeurs[0]>2)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->Fonte=Valeurs[0]-1; + + + if ((Retour=Charger_INI_Reach_group(Fichier,Buffer,"[FILE_SELECTOR]"))) + goto Erreur_Retour; + + if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Show_hidden_files",1,Valeurs))) + goto Erreur_Retour; + if ((Valeurs[0]<0) || (Valeurs[0]>1)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->Lire_les_fichiers_caches=Valeurs[0]?-1:0; + + if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Show_hidden_directories",1,Valeurs))) + goto Erreur_Retour; + if ((Valeurs[0]<0) || (Valeurs[0]>1)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->Lire_les_repertoires_caches=Valeurs[0]?-1:0; + + if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Show_system_directories",1,Valeurs))) + goto Erreur_Retour; + if ((Valeurs[0]<0) || (Valeurs[0]>1)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->Lire_les_repertoires_systemes=Valeurs[0]?-1:0; + + if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Preview_delay",1,Valeurs))) + goto Erreur_Retour; + if ((Valeurs[0]<1) || (Valeurs[0]>256)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->Chrono_delay=Valeurs[0]; + + if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Maximize_preview",1,Valeurs))) + goto Erreur_Retour; + if ((Valeurs[0]<0) || (Valeurs[0]>1)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->Maximize_preview=Valeurs[0]; + + if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Find_file_fast",1,Valeurs))) + goto Erreur_Retour; + if ((Valeurs[0]<0) || (Valeurs[0]>2)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->Find_file_fast=Valeurs[0]; + + + if ((Retour=Charger_INI_Reach_group(Fichier,Buffer,"[LOADING]"))) + goto Erreur_Retour; + + if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Auto_set_resolution",1,Valeurs))) + goto Erreur_Retour; + if ((Valeurs[0]<0) || (Valeurs[0]>1)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->Auto_set_res=Valeurs[0]; + + if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Set_resolution_according_to",1,Valeurs))) + goto Erreur_Retour; + if ((Valeurs[0]<1) || (Valeurs[0]>2)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->Set_resolution_according_to=Valeurs[0]; + + if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Clear_palette",1,Valeurs))) + goto Erreur_Retour; + if ((Valeurs[0]<0) || (Valeurs[0]>1)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->Clear_palette=Valeurs[0]; + + + if ((Retour=Charger_INI_Reach_group(Fichier,Buffer,"[MISCELLANEOUS]"))) + goto Erreur_Retour; + + if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Draw_limits",1,Valeurs))) + goto Erreur_Retour; + if ((Valeurs[0]<0) || (Valeurs[0]>1)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->Afficher_limites_image=Valeurs[0]; + + if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Adjust_brush_pick",1,Valeurs))) + goto Erreur_Retour; + if ((Valeurs[0]<0) || (Valeurs[0]>1)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->Adjust_brush_pick=Valeurs[0]; + + if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Coordinates",1,Valeurs))) + goto Erreur_Retour; + if ((Valeurs[0]<1) || (Valeurs[0]>2)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->Coords_rel=2-Valeurs[0]; + + if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Backup",1,Valeurs))) + goto Erreur_Retour; + if ((Valeurs[0]<0) || (Valeurs[0]>1)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->Backup=Valeurs[0]; + + if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Undo_pages",1,Valeurs))) + goto Erreur_Retour; + if ((Valeurs[0]<1) || (Valeurs[0]>99)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->Nb_pages_Undo=Valeurs[0]; + + if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Gauges_scrolling_speed_Left",1,Valeurs))) + goto Erreur_Retour; + if ((Valeurs[0]<1) || (Valeurs[0]>255)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->Valeur_tempo_jauge_gauche=Valeurs[0]; + + if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Gauges_scrolling_speed_Right",1,Valeurs))) + goto Erreur_Retour; + if ((Valeurs[0]<1) || (Valeurs[0]>255)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->Valeur_tempo_jauge_droite=Valeurs[0]; + + if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Auto_save",1,Valeurs))) + goto Erreur_Retour; + if ((Valeurs[0]<0) || (Valeurs[0]>1)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->Auto_save=Valeurs[0]; + + if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Vertices_per_polygon",1,Valeurs))) + goto Erreur_Retour; + if ((Valeurs[0]<2) || (Valeurs[0]>16384)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->Nb_max_de_vertex_par_polygon=Valeurs[0]; + + if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Fast_zoom",1,Valeurs))) + goto Erreur_Retour; + if ((Valeurs[0]<0) || (Valeurs[0]>1)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->Fast_zoom=Valeurs[0]; + + if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Separate_colors",1,Valeurs))) + goto Erreur_Retour; + if ((Valeurs[0]<0) || (Valeurs[0]>1)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->Couleurs_separees=Valeurs[0]; + + if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"FX_feedback",1,Valeurs))) + goto Erreur_Retour; + if ((Valeurs[0]<0) || (Valeurs[0]>1)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->FX_Feedback=Valeurs[0]; + + if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Safety_colors",1,Valeurs))) + goto Erreur_Retour; + if ((Valeurs[0]<0) || (Valeurs[0]>1)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->Safety_colors=Valeurs[0]; + + if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Opening_message",1,Valeurs))) + goto Erreur_Retour; + if ((Valeurs[0]<0) || (Valeurs[0]>1)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->Opening_message=Valeurs[0]; + + if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Clear_with_stencil",1,Valeurs))) + goto Erreur_Retour; + if ((Valeurs[0]<0) || (Valeurs[0]>1)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->Clear_with_stencil=Valeurs[0]; + + if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Auto_discontinuous",1,Valeurs))) + goto Erreur_Retour; + if ((Valeurs[0]<0) || (Valeurs[0]>1)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->Auto_discontinuous=Valeurs[0]; + + if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Save_screen_size_in_GIF",1,Valeurs))) + goto Erreur_Retour; + if ((Valeurs[0]<0) || (Valeurs[0]>1)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->Taille_ecran_dans_GIF=Valeurs[0]; + + if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Auto_nb_colors_used",1,Valeurs))) + goto Erreur_Retour; + if ((Valeurs[0]<0) || (Valeurs[0]>1)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->Auto_nb_used=Valeurs[0]; + + if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Default_video_mode",1,Valeurs))) + goto Erreur_Retour; + if ((Valeurs[0]MODE_1024_768)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->Resolution_par_defaut=Valeurs[0]; + + fclose(Fichier); + } + else + { + free(Nom_du_fichier); + free(Buffer); + return ERREUR_INI_ABSENT; + } + + free(Nom_du_fichier); + free(Buffer); + return 0; + + // Gestion des erreurs: + + Erreur_Retour: + + fclose(Fichier); + free(Nom_du_fichier); + free(Buffer); + return Retour; + + Erreur_ERREUR_INI_CORROMPU: + + fclose(Fichier); + free(Nom_du_fichier); + free(Buffer); + return ERREUR_INI_CORROMPU; +} diff --git a/saveini.c b/saveini.c index 1fb45a40..b3764536 100644 --- a/saveini.c +++ b/saveini.c @@ -1,502 +1,502 @@ #include #include "const.h" #include "global.h" - -int Sauver_INI_Reach_group(FILE * Old_file,FILE * New_file,char * Buffer,char * Group) -{ - int Arret; - char * Group_upper; - char * Buffer_upper; - - // On alloue les zones de m‚moire: - Group_upper =(char *)malloc(1024); - Buffer_upper=(char *)malloc(1024); - - // On commence par se faire une version majuscule du groupe … rechercher: - strcpy(Group_upper,Group); - Charger_INI_Clear_string(Group_upper); - - Arret=0; - do - { - // On lit une ligne dans le fichier: - if (fgets(Buffer,1024,Old_file)==0) - { - free(Buffer_upper); - free(Group_upper); - return ERREUR_INI_CORROMPU; - } - - // On s'en fait une version en majuscule: - strcpy(Buffer_upper,Buffer); - Charger_INI_Clear_string(Buffer_upper); - - // On compare la chaŒne avec le groupe recherch‚: - Arret=Charger_INI_Seek_pattern(Buffer_upper,Group_upper); - if (fprintf(New_file,"%s",Buffer)<0) - { - free(Buffer_upper); - free(Group_upper); - return ERREUR_SAUVEGARDE_INI; - } - } - while (Arret==0); - - free(Buffer_upper); - free(Group_upper); - - return 0; -} - - - -int Sauver_INI_char_in_value_alphabet(char Char) -{ - if ( - ( // Chiffre - (Char>='0') && - (Char<='9') - ) || - ( // Lettre majuscule - (Char>='A') && - (Char<='Z') - ) || - ( // Lettre minuscule - (Char>='a') && - (Char<='z') - ) || - (Char == '$') // Symbole d'hexad‚cimal - ) - return 1; - else - return 0; -} - - - -void Sauver_INI_Set_value(char * Destination,char * Source,int Nb_values_to_set,int * Values,int Litteral) -{ - int Indice_destination; - int Indice_source; - int Indice_valeur; - - // On commence par recopier tout jusqu'au symbole '=': - for (Indice_source=0;Source[Indice_source]!='=';Indice_source++) - Destination[Indice_source]=Source[Indice_source]; - - // Puis on recopie le symbole '=': - Destination[Indice_source]=Source[Indice_source]; - Indice_source++; - - // Puis on recopie tous les espaces qui suivent: - for (;Source[Indice_source]==' ';Indice_source++) - Destination[Indice_source]=Source[Indice_source]; - - // Pour l'instant, la source et la destination en sont au mˆme point: - Indice_destination=Indice_source; - - // Puis pour chaque valeur … recopier: - for (Indice_valeur=0;Indice_valeur Yes - - memcpy(Destination+Indice_destination,"yes",3); - Indice_destination+=3; - } - else - { - // La valeur <=> No - - memcpy(Destination+Indice_destination,"no",2); - Indice_destination+=2; - } - } - else - { - // La valeur doit ˆtre ‚crite sous forme num‚rique - - if (Source[Indice_source]=='$') - { - // On va ‚crire la valeur sous forme hexad‚cimale: - - // On commence par inscrire le symbole '$': - Destination[Indice_destination]='$'; - - // Puis on y concatŠne la valeur: - sprintf(Destination+Indice_destination+1,"%x",Values[Indice_valeur]); - Indice_destination+=strlen(Destination+Indice_destination); - } - else - { - // On va ‚crire la valeur sous forme d‚cimale: - sprintf(Destination+Indice_destination,"%d",Values[Indice_valeur]); - Indice_destination+=strlen(Destination+Indice_destination); - } - } - - // Dans la source, on saute la valeur: - for (;Sauver_INI_char_in_value_alphabet(Source[Indice_source]) && (Source[Indice_source]!='\0');Indice_source++); - - if (Indice_valeur!=(Nb_values_to_set-1)) - { - // Il reste d'autres valeurs … ‚crire - - // On recopie tous les caractŠres de la source jusqu'au suivant qui - // d‚signe une valeur: - for (;(!Sauver_INI_char_in_value_alphabet(Source[Indice_source])) && (Source[Indice_source]!='\0');Indice_source++,Indice_destination++) - Destination[Indice_destination]=Source[Indice_source]; - } - else - { - // C'est la derniŠre valeur … initialiser - - // On recopie toute la fin de la ligne: - for (;Source[Indice_source]!='\0';Indice_source++,Indice_destination++) - Destination[Indice_destination]=Source[Indice_source]; - - // Et on n'oublie pas d'y mettre l''\0': - Destination[Indice_destination]='\0'; - } - } -} - - - -int Sauver_INI_Set_values(FILE * Old_file,FILE * New_file,char * Buffer,char * Option,int Nb_values_to_set,int * Values,int Litteral) -{ - int Arret; - char * Option_upper; - char * Buffer_upper; - char * Buffer_resultat; - //int Indice_buffer; - - // On alloue les zones de m‚moire: - Option_upper=(char *)malloc(1024); - Buffer_upper=(char *)malloc(1024); - Buffer_resultat=(char *)malloc(1024); - - // On commence par se faire une version majuscule de l'option … rechercher: - strcpy(Option_upper,Option); - Charger_INI_Clear_string(Option_upper); - - Arret=0; - do - { - // On lit une ligne dans le fichier: - if (fgets(Buffer,1024,Old_file)==0) - { - free(Buffer_resultat); - free(Buffer_upper); - free(Option_upper); - return ERREUR_INI_CORROMPU; - } - - // On s'en fait une version en majuscule: - strcpy(Buffer_upper,Buffer); - Charger_INI_Clear_string(Buffer_upper); - - // On compare la chaŒne avec l'option recherch‚e: - Arret=Charger_INI_Seek_pattern(Buffer_upper,Option_upper); - - if (Arret) - { - // On l'a trouv‚e: - - Sauver_INI_Set_value(Buffer_resultat,Buffer,Nb_values_to_set,Values,Litteral); - if (fprintf(New_file,"%s",Buffer_resultat)<0) - { - free(Buffer_resultat); - free(Buffer_upper); - free(Option_upper); - return ERREUR_SAUVEGARDE_INI; - } - } - else - { - // On l'a pas trouv‚e: - - if (fprintf(New_file,"%s",Buffer)<0) - { - free(Buffer_resultat); - free(Buffer_upper); - free(Option_upper); - return ERREUR_SAUVEGARDE_INI; - } - } - } - while (Arret==0); - - free(Buffer_resultat); - free(Buffer_upper); - free(Option_upper); - - return 0; -} - - - -void Sauver_INI_Flush(FILE * Old_file,FILE * New_file,char * Buffer) -{ - while (fgets(Buffer,1024,Old_file)!=0) - fprintf(New_file,"%s",Buffer); -} - - - -int Sauver_INI(struct S_Config * Conf) -{ - FILE * Ancien_fichier; - FILE * Nouveau_fichier; - char * Buffer; - int Valeurs[3]; - char * Nom_du_fichier; - char * Nom_du_fichier_temporaire; - int Retour; - - // On alloue les zones de m‚moire: - Buffer=(char *)malloc(1024); - Nom_du_fichier=(char *)malloc(256); - Nom_du_fichier_temporaire=(char *)malloc(256); - - // On calcule les noms des fichiers qu'on manipule: - strcpy(Nom_du_fichier,Repertoire_du_programme); - strcat(Nom_du_fichier,"GFX2.INI"); - - strcpy(Nom_du_fichier_temporaire,Repertoire_du_programme); - strcat(Nom_du_fichier_temporaire,"GFX2.$$$"); - - // On renome l'ancienne version du fichier INI vers un fichier temporaire: - if (rename(Nom_du_fichier,Nom_du_fichier_temporaire)!=0) - goto Erreur_ERREUR_SAUVEGARDE_INI; - - Ancien_fichier=fopen(Nom_du_fichier_temporaire,"r"); - if (Ancien_fichier!=0) - { - Nouveau_fichier=fopen(Nom_du_fichier,"w"); - if (Nouveau_fichier!=0) - { - if ((Retour=Sauver_INI_Reach_group(Ancien_fichier,Nouveau_fichier,Buffer,"[MOUSE]"))) - goto Erreur_Retour; - - Valeurs[0]=Conf->Indice_Sensibilite_souris_X; - if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"X_sensitivity",1,Valeurs,0))) - goto Erreur_Retour; - - Valeurs[0]=Conf->Indice_Sensibilite_souris_Y; - if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Y_sensitivity",1,Valeurs,0))) - goto Erreur_Retour; - - Valeurs[0]=Conf->Mouse_Facteur_de_correction_X; - if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"X_correction_factor",1,Valeurs,0))) - goto Erreur_Retour; - - Valeurs[0]=Conf->Mouse_Facteur_de_correction_Y; - if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Y_correction_factor",1,Valeurs,0))) - goto Erreur_Retour; - - Valeurs[0]=(Conf->Curseur)+1; - if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Cursor_aspect",1,Valeurs,0))) - goto Erreur_Retour; - - - if ((Retour=Sauver_INI_Reach_group(Ancien_fichier,Nouveau_fichier,Buffer,"[MENU]"))) - goto Erreur_Retour; - - Valeurs[0]=Conf->Coul_menu_pref[2].R; - Valeurs[1]=Conf->Coul_menu_pref[2].V; - Valeurs[2]=Conf->Coul_menu_pref[2].B; - if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Light_color",3,Valeurs,0))) - goto Erreur_Retour; - - Valeurs[0]=Conf->Coul_menu_pref[1].R; - Valeurs[1]=Conf->Coul_menu_pref[1].V; - Valeurs[2]=Conf->Coul_menu_pref[1].B; - if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Dark_color",3,Valeurs,0))) - goto Erreur_Retour; - - Valeurs[0]=Conf->Ratio; - if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Menu_ratio",1,Valeurs,0))) - goto Erreur_Retour; - - Valeurs[0]=(Conf->Fonte)+1; - if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Font",1,Valeurs,0))) - goto Erreur_Retour; - - - if ((Retour=Sauver_INI_Reach_group(Ancien_fichier,Nouveau_fichier,Buffer,"[FILE_SELECTOR]"))) - goto Erreur_Retour; - - Valeurs[0]=Conf->Lire_les_fichiers_caches?1:0; - if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Show_hidden_files",1,Valeurs,1))) - goto Erreur_Retour; - - Valeurs[0]=Conf->Lire_les_repertoires_caches?1:0; - if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Show_hidden_directories",1,Valeurs,1))) - goto Erreur_Retour; - - Valeurs[0]=Conf->Lire_les_repertoires_systemes?1:0; - if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Show_system_directories",1,Valeurs,1))) - goto Erreur_Retour; - - Valeurs[0]=Conf->Chrono_delay; - if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Preview_delay",1,Valeurs,0))) - goto Erreur_Retour; - - Valeurs[0]=Conf->Maximize_preview; - if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Maximize_preview",1,Valeurs,1))) - goto Erreur_Retour; - - Valeurs[0]=Conf->Find_file_fast; - if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Find_file_fast",1,Valeurs,0))) - goto Erreur_Retour; - - - if ((Retour=Sauver_INI_Reach_group(Ancien_fichier,Nouveau_fichier,Buffer,"[LOADING]"))) - goto Erreur_Retour; - - Valeurs[0]=Conf->Auto_set_res; - if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Auto_set_resolution",1,Valeurs,1))) - goto Erreur_Retour; - - Valeurs[0]=Conf->Set_resolution_according_to; - if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Set_resolution_according_to",1,Valeurs,0))) - goto Erreur_Retour; - - Valeurs[0]=Conf->Clear_palette; - if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Clear_palette",1,Valeurs,1))) - goto Erreur_Retour; - - - if ((Retour=Sauver_INI_Reach_group(Ancien_fichier,Nouveau_fichier,Buffer,"[MISCELLANEOUS]"))) - goto Erreur_Retour; - - Valeurs[0]=Conf->Afficher_limites_image; - if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Draw_limits",1,Valeurs,1))) - goto Erreur_Retour; - - Valeurs[0]=Conf->Adjust_brush_pick; - if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Adjust_brush_pick",1,Valeurs,1))) - goto Erreur_Retour; - - Valeurs[0]=2-Conf->Coords_rel; - if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Coordinates",1,Valeurs,0))) - goto Erreur_Retour; - - Valeurs[0]=Conf->Backup; - if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Backup",1,Valeurs,1))) - goto Erreur_Retour; - - Valeurs[0]=Conf->Nb_pages_Undo; - if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Undo_pages",1,Valeurs,0))) - goto Erreur_Retour; - - Valeurs[0]=Conf->Valeur_tempo_jauge_gauche; - if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Gauges_scrolling_speed_Left",1,Valeurs,0))) - goto Erreur_Retour; - - Valeurs[0]=Conf->Valeur_tempo_jauge_droite; - if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Gauges_scrolling_speed_Right",1,Valeurs,0))) - goto Erreur_Retour; - - Valeurs[0]=Conf->Auto_save; - if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Auto_save",1,Valeurs,1))) - goto Erreur_Retour; - - Valeurs[0]=Conf->Nb_max_de_vertex_par_polygon; - if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Vertices_per_polygon",1,Valeurs,0))) - goto Erreur_Retour; - - Valeurs[0]=Conf->Fast_zoom; - if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Fast_zoom",1,Valeurs,1))) - goto Erreur_Retour; - - Valeurs[0]=Conf->Couleurs_separees; - if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Separate_colors",1,Valeurs,1))) - goto Erreur_Retour; - - Valeurs[0]=Conf->FX_Feedback; - if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"FX_feedback",1,Valeurs,1))) - goto Erreur_Retour; - - Valeurs[0]=Conf->Safety_colors; - if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Safety_colors",1,Valeurs,1))) - goto Erreur_Retour; - - Valeurs[0]=Conf->Opening_message; - if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Opening_message",1,Valeurs,1))) - goto Erreur_Retour; - - Valeurs[0]=Conf->Clear_with_stencil; - if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Clear_with_stencil",1,Valeurs,1))) - goto Erreur_Retour; - - Valeurs[0]=Conf->Auto_discontinuous; - if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Auto_discontinuous",1,Valeurs,1))) - goto Erreur_Retour; - - Valeurs[0]=Conf->Taille_ecran_dans_GIF; - if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Save_screen_size_in_GIF",1,Valeurs,1))) - goto Erreur_Retour; - - Valeurs[0]=Conf->Auto_nb_used; - if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Auto_nb_colors_used",1,Valeurs,1))) - goto Erreur_Retour; - - Valeurs[0]=Conf->Resolution_par_defaut; - if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Default_video_mode",1,Valeurs,0))) - goto Erreur_Retour; - - Sauver_INI_Flush(Ancien_fichier,Nouveau_fichier,Buffer); - - fclose(Nouveau_fichier); - } - else - { - fclose(Ancien_fichier); - goto Erreur_ERREUR_SAUVEGARDE_INI; - } - - fclose(Ancien_fichier); - } - else - { - free(Nom_du_fichier_temporaire); - free(Nom_du_fichier); - free(Buffer); - return ERREUR_INI_ABSENT; - } - - // On efface le fichier temporaire <=> Ancienne version du .INI - remove(Nom_du_fichier_temporaire); - - free(Nom_du_fichier_temporaire); - free(Nom_du_fichier); - free(Buffer); - return 0; - - // Gestion des erreurs: - - Erreur_Retour: - - fclose(Nouveau_fichier); - fclose(Ancien_fichier); - free(Nom_du_fichier_temporaire); - free(Nom_du_fichier); - free(Buffer); - return Retour; - - Erreur_ERREUR_SAUVEGARDE_INI: - - free(Nom_du_fichier_temporaire); - free(Nom_du_fichier); - free(Buffer); - return ERREUR_SAUVEGARDE_INI; -} +int Sauver_INI_Reach_group(FILE * Old_file,FILE * New_file,char * Buffer,char * Group) +{ + int Arret; + char * Group_upper; + char * Buffer_upper; + + // On alloue les zones de m‚moire: + Group_upper =(char *)malloc(1024); + Buffer_upper=(char *)malloc(1024); + + // On commence par se faire une version majuscule du groupe … rechercher: + strcpy(Group_upper,Group); + Charger_INI_Clear_string(Group_upper); + + Arret=0; + do + { + // On lit une ligne dans le fichier: + if (fgets(Buffer,1024,Old_file)==0) + { + free(Buffer_upper); + free(Group_upper); + return ERREUR_INI_CORROMPU; + } + + // On s'en fait une version en majuscule: + strcpy(Buffer_upper,Buffer); + Charger_INI_Clear_string(Buffer_upper); + + // On compare la chaŒne avec le groupe recherch‚: + Arret=Charger_INI_Seek_pattern(Buffer_upper,Group_upper); + if (fprintf(New_file,"%s",Buffer)<0) + { + free(Buffer_upper); + free(Group_upper); + return ERREUR_SAUVEGARDE_INI; + } + } + while (Arret==0); + + free(Buffer_upper); + free(Group_upper); + + return 0; +} + + + +int Sauver_INI_char_in_value_alphabet(char Char) +{ + if ( + ( // Chiffre + (Char>='0') && + (Char<='9') + ) || + ( // Lettre majuscule + (Char>='A') && + (Char<='Z') + ) || + ( // Lettre minuscule + (Char>='a') && + (Char<='z') + ) || + (Char == '$') // Symbole d'hexad‚cimal + ) + return 1; + else + return 0; +} + + + +void Sauver_INI_Set_value(char * Destination,char * Source,int Nb_values_to_set,int * Values,int Litteral) +{ + int Indice_destination; + int Indice_source; + int Indice_valeur; + + // On commence par recopier tout jusqu'au symbole '=': + for (Indice_source=0;Source[Indice_source]!='=';Indice_source++) + Destination[Indice_source]=Source[Indice_source]; + + // Puis on recopie le symbole '=': + Destination[Indice_source]=Source[Indice_source]; + Indice_source++; + + // Puis on recopie tous les espaces qui suivent: + for (;Source[Indice_source]==' ';Indice_source++) + Destination[Indice_source]=Source[Indice_source]; + + // Pour l'instant, la source et la destination en sont au mˆme point: + Indice_destination=Indice_source; + + // Puis pour chaque valeur … recopier: + for (Indice_valeur=0;Indice_valeur Yes + + memcpy(Destination+Indice_destination,"yes",3); + Indice_destination+=3; + } + else + { + // La valeur <=> No + + memcpy(Destination+Indice_destination,"no",2); + Indice_destination+=2; + } + } + else + { + // La valeur doit ˆtre ‚crite sous forme num‚rique + + if (Source[Indice_source]=='$') + { + // On va ‚crire la valeur sous forme hexad‚cimale: + + // On commence par inscrire le symbole '$': + Destination[Indice_destination]='$'; + + // Puis on y concatŠne la valeur: + sprintf(Destination+Indice_destination+1,"%x",Values[Indice_valeur]); + Indice_destination+=strlen(Destination+Indice_destination); + } + else + { + // On va ‚crire la valeur sous forme d‚cimale: + + sprintf(Destination+Indice_destination,"%d",Values[Indice_valeur]); + Indice_destination+=strlen(Destination+Indice_destination); + } + } + + // Dans la source, on saute la valeur: + for (;Sauver_INI_char_in_value_alphabet(Source[Indice_source]) && (Source[Indice_source]!='\0');Indice_source++); + + if (Indice_valeur!=(Nb_values_to_set-1)) + { + // Il reste d'autres valeurs … ‚crire + + // On recopie tous les caractŠres de la source jusqu'au suivant qui + // d‚signe une valeur: + for (;(!Sauver_INI_char_in_value_alphabet(Source[Indice_source])) && (Source[Indice_source]!='\0');Indice_source++,Indice_destination++) + Destination[Indice_destination]=Source[Indice_source]; + } + else + { + // C'est la derniŠre valeur … initialiser + + // On recopie toute la fin de la ligne: + for (;Source[Indice_source]!='\0';Indice_source++,Indice_destination++) + Destination[Indice_destination]=Source[Indice_source]; + + // Et on n'oublie pas d'y mettre l''\0': + Destination[Indice_destination]='\0'; + } + } +} + + + +int Sauver_INI_Set_values(FILE * Old_file,FILE * New_file,char * Buffer,char * Option,int Nb_values_to_set,int * Values,int Litteral) +{ + int Arret; + char * Option_upper; + char * Buffer_upper; + char * Buffer_resultat; + //int Indice_buffer; + + // On alloue les zones de m‚moire: + Option_upper=(char *)malloc(1024); + Buffer_upper=(char *)malloc(1024); + Buffer_resultat=(char *)malloc(1024); + + // On commence par se faire une version majuscule de l'option … rechercher: + strcpy(Option_upper,Option); + Charger_INI_Clear_string(Option_upper); + + Arret=0; + do + { + // On lit une ligne dans le fichier: + if (fgets(Buffer,1024,Old_file)==0) + { + free(Buffer_resultat); + free(Buffer_upper); + free(Option_upper); + return ERREUR_INI_CORROMPU; + } + + // On s'en fait une version en majuscule: + strcpy(Buffer_upper,Buffer); + Charger_INI_Clear_string(Buffer_upper); + + // On compare la chaŒne avec l'option recherch‚e: + Arret=Charger_INI_Seek_pattern(Buffer_upper,Option_upper); + + if (Arret) + { + // On l'a trouv‚e: + + Sauver_INI_Set_value(Buffer_resultat,Buffer,Nb_values_to_set,Values,Litteral); + if (fprintf(New_file,"%s",Buffer_resultat)<0) + { + free(Buffer_resultat); + free(Buffer_upper); + free(Option_upper); + return ERREUR_SAUVEGARDE_INI; + } + } + else + { + // On l'a pas trouv‚e: + + if (fprintf(New_file,"%s",Buffer)<0) + { + free(Buffer_resultat); + free(Buffer_upper); + free(Option_upper); + return ERREUR_SAUVEGARDE_INI; + } + } + } + while (Arret==0); + + free(Buffer_resultat); + free(Buffer_upper); + free(Option_upper); + + return 0; +} + + + +void Sauver_INI_Flush(FILE * Old_file,FILE * New_file,char * Buffer) +{ + while (fgets(Buffer,1024,Old_file)!=0) + fprintf(New_file,"%s",Buffer); +} + + + +int Sauver_INI(struct S_Config * Conf) +{ + FILE * Ancien_fichier; + FILE * Nouveau_fichier; + char * Buffer; + int Valeurs[3]; + char * Nom_du_fichier; + char * Nom_du_fichier_temporaire; + int Retour; + + // On alloue les zones de m‚moire: + Buffer=(char *)malloc(1024); + Nom_du_fichier=(char *)malloc(256); + Nom_du_fichier_temporaire=(char *)malloc(256); + + // On calcule les noms des fichiers qu'on manipule: + strcpy(Nom_du_fichier,Repertoire_du_programme); + strcat(Nom_du_fichier,"gfx2.ini"); + + strcpy(Nom_du_fichier_temporaire,Repertoire_du_programme); + strcat(Nom_du_fichier_temporaire,"gfx2.$$$"); + + // On renome l'ancienne version du fichier INI vers un fichier temporaire: + if (rename(Nom_du_fichier,Nom_du_fichier_temporaire)!=0) + goto Erreur_ERREUR_SAUVEGARDE_INI; + + Ancien_fichier=fopen(Nom_du_fichier_temporaire,"r"); + if (Ancien_fichier!=0) + { + Nouveau_fichier=fopen(Nom_du_fichier,"w"); + if (Nouveau_fichier!=0) + { + if ((Retour=Sauver_INI_Reach_group(Ancien_fichier,Nouveau_fichier,Buffer,"[MOUSE]"))) + goto Erreur_Retour; + + Valeurs[0]=Conf->Indice_Sensibilite_souris_X; + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"X_sensitivity",1,Valeurs,0))) + goto Erreur_Retour; + + Valeurs[0]=Conf->Indice_Sensibilite_souris_Y; + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Y_sensitivity",1,Valeurs,0))) + goto Erreur_Retour; + + Valeurs[0]=Conf->Mouse_Facteur_de_correction_X; + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"X_correction_factor",1,Valeurs,0))) + goto Erreur_Retour; + + Valeurs[0]=Conf->Mouse_Facteur_de_correction_Y; + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Y_correction_factor",1,Valeurs,0))) + goto Erreur_Retour; + + Valeurs[0]=(Conf->Curseur)+1; + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Cursor_aspect",1,Valeurs,0))) + goto Erreur_Retour; + + + if ((Retour=Sauver_INI_Reach_group(Ancien_fichier,Nouveau_fichier,Buffer,"[MENU]"))) + goto Erreur_Retour; + + Valeurs[0]=Conf->Coul_menu_pref[2].R; + Valeurs[1]=Conf->Coul_menu_pref[2].V; + Valeurs[2]=Conf->Coul_menu_pref[2].B; + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Light_color",3,Valeurs,0))) + goto Erreur_Retour; + + Valeurs[0]=Conf->Coul_menu_pref[1].R; + Valeurs[1]=Conf->Coul_menu_pref[1].V; + Valeurs[2]=Conf->Coul_menu_pref[1].B; + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Dark_color",3,Valeurs,0))) + goto Erreur_Retour; + + Valeurs[0]=Conf->Ratio; + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Menu_ratio",1,Valeurs,0))) + goto Erreur_Retour; + + Valeurs[0]=(Conf->Fonte)+1; + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Font",1,Valeurs,0))) + goto Erreur_Retour; + + + if ((Retour=Sauver_INI_Reach_group(Ancien_fichier,Nouveau_fichier,Buffer,"[FILE_SELECTOR]"))) + goto Erreur_Retour; + + Valeurs[0]=Conf->Lire_les_fichiers_caches?1:0; + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Show_hidden_files",1,Valeurs,1))) + goto Erreur_Retour; + + Valeurs[0]=Conf->Lire_les_repertoires_caches?1:0; + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Show_hidden_directories",1,Valeurs,1))) + goto Erreur_Retour; + + Valeurs[0]=Conf->Lire_les_repertoires_systemes?1:0; + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Show_system_directories",1,Valeurs,1))) + goto Erreur_Retour; + + Valeurs[0]=Conf->Chrono_delay; + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Preview_delay",1,Valeurs,0))) + goto Erreur_Retour; + + Valeurs[0]=Conf->Maximize_preview; + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Maximize_preview",1,Valeurs,1))) + goto Erreur_Retour; + + Valeurs[0]=Conf->Find_file_fast; + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Find_file_fast",1,Valeurs,0))) + goto Erreur_Retour; + + + if ((Retour=Sauver_INI_Reach_group(Ancien_fichier,Nouveau_fichier,Buffer,"[LOADING]"))) + goto Erreur_Retour; + + Valeurs[0]=Conf->Auto_set_res; + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Auto_set_resolution",1,Valeurs,1))) + goto Erreur_Retour; + + Valeurs[0]=Conf->Set_resolution_according_to; + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Set_resolution_according_to",1,Valeurs,0))) + goto Erreur_Retour; + + Valeurs[0]=Conf->Clear_palette; + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Clear_palette",1,Valeurs,1))) + goto Erreur_Retour; + + + if ((Retour=Sauver_INI_Reach_group(Ancien_fichier,Nouveau_fichier,Buffer,"[MISCELLANEOUS]"))) + goto Erreur_Retour; + + Valeurs[0]=Conf->Afficher_limites_image; + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Draw_limits",1,Valeurs,1))) + goto Erreur_Retour; + + Valeurs[0]=Conf->Adjust_brush_pick; + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Adjust_brush_pick",1,Valeurs,1))) + goto Erreur_Retour; + + Valeurs[0]=2-Conf->Coords_rel; + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Coordinates",1,Valeurs,0))) + goto Erreur_Retour; + + Valeurs[0]=Conf->Backup; + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Backup",1,Valeurs,1))) + goto Erreur_Retour; + + Valeurs[0]=Conf->Nb_pages_Undo; + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Undo_pages",1,Valeurs,0))) + goto Erreur_Retour; + + Valeurs[0]=Conf->Valeur_tempo_jauge_gauche; + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Gauges_scrolling_speed_Left",1,Valeurs,0))) + goto Erreur_Retour; + + Valeurs[0]=Conf->Valeur_tempo_jauge_droite; + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Gauges_scrolling_speed_Right",1,Valeurs,0))) + goto Erreur_Retour; + + Valeurs[0]=Conf->Auto_save; + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Auto_save",1,Valeurs,1))) + goto Erreur_Retour; + + Valeurs[0]=Conf->Nb_max_de_vertex_par_polygon; + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Vertices_per_polygon",1,Valeurs,0))) + goto Erreur_Retour; + + Valeurs[0]=Conf->Fast_zoom; + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Fast_zoom",1,Valeurs,1))) + goto Erreur_Retour; + + Valeurs[0]=Conf->Couleurs_separees; + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Separate_colors",1,Valeurs,1))) + goto Erreur_Retour; + + Valeurs[0]=Conf->FX_Feedback; + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"FX_feedback",1,Valeurs,1))) + goto Erreur_Retour; + + Valeurs[0]=Conf->Safety_colors; + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Safety_colors",1,Valeurs,1))) + goto Erreur_Retour; + + Valeurs[0]=Conf->Opening_message; + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Opening_message",1,Valeurs,1))) + goto Erreur_Retour; + + Valeurs[0]=Conf->Clear_with_stencil; + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Clear_with_stencil",1,Valeurs,1))) + goto Erreur_Retour; + + Valeurs[0]=Conf->Auto_discontinuous; + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Auto_discontinuous",1,Valeurs,1))) + goto Erreur_Retour; + + Valeurs[0]=Conf->Taille_ecran_dans_GIF; + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Save_screen_size_in_GIF",1,Valeurs,1))) + goto Erreur_Retour; + + Valeurs[0]=Conf->Auto_nb_used; + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Auto_nb_colors_used",1,Valeurs,1))) + goto Erreur_Retour; + + Valeurs[0]=Conf->Resolution_par_defaut; + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Default_video_mode",1,Valeurs,0))) + goto Erreur_Retour; + + Sauver_INI_Flush(Ancien_fichier,Nouveau_fichier,Buffer); + + fclose(Nouveau_fichier); + } + else + { + fclose(Ancien_fichier); + goto Erreur_ERREUR_SAUVEGARDE_INI; + } + + fclose(Ancien_fichier); + } + else + { + free(Nom_du_fichier_temporaire); + free(Nom_du_fichier); + free(Buffer); + return ERREUR_INI_ABSENT; + } + + // On efface le fichier temporaire <=> Ancienne version du .INI + remove(Nom_du_fichier_temporaire); + + free(Nom_du_fichier_temporaire); + free(Nom_du_fichier); + free(Buffer); + return 0; + + // Gestion des erreurs: + + Erreur_Retour: + + fclose(Nouveau_fichier); + fclose(Ancien_fichier); + free(Nom_du_fichier_temporaire); + free(Nom_du_fichier); + free(Buffer); + return Retour; + + Erreur_ERREUR_SAUVEGARDE_INI: + + free(Nom_du_fichier_temporaire); + free(Nom_du_fichier); + free(Buffer); + return ERREUR_SAUVEGARDE_INI; +} diff --git a/struct.h b/struct.h index 7bb8977c..2b360995 100644 --- a/struct.h +++ b/struct.h @@ -114,9 +114,9 @@ struct T_Degrade_Tableau { byte Debut; // PremiŠre couleur du dégradé byte Fin; // DerniŠre couleur du dégradé - int Inverse; // "Le dégradé va de Fin … Debut" - long Melange; // Valeur de mélange du dégradé (0-255) - int Technique; // Technique … utiliser (0-2) + dword Inverse; // "Le dégradé va de Fin … Debut" //INT + dword Melange; // Valeur de mélange du dégradé (0-255) //LONG + dword Technique; // Technique … utiliser (0-2) //INT }; // Déclaration d'une info de shade