/************************************************************************ * * * READLINE (proc‚dure permettant de saisir une chaŒne de caractŠres) * * * ************************************************************************/ #include "const.h" #include "struct.h" #include "global.h" #include "graph.h" #include "divers.h" #include "erreurs.h" #ifdef __linux__ #include "linux.h" #endif #define COULEUR_TEXTE CM_Noir #define COULEUR_FOND CM_Clair #define COULEUR_TEXTE_CURSEUR CM_Noir #define COULEUR_FOND_CURSEUR CM_Fonce // Vérification de la validité d'un nom de fichier byte Chaine_valide(char * Chaine) { byte Point_trouve=0; // Booléen "on a trouvé un point dans la chaine" byte Taille_racine=0; // Taille de la racine du nom de fichier byte Taille_extension=0; // Taille de l'extension du nom de fichier byte Position; // Position du caractère dans la chaîne en cours d'étude for (Position=0;Chaine[Position]!='\0';Position++) { if (Chaine[Position]!='.') { if (Point_trouve) Taille_extension++; else Taille_racine++; } else { if (Point_trouve) return 0; else Point_trouve=1; } } return ( (Taille_racine>0) && (Taille_racine<=8) && (Taille_extension<=3) ); } // Suppresion d'un caractŠre … une certaine POSITION dans une CHAINE. void Supprimer_caractere(char * Chaine, byte Position) { for (;Chaine[Position]!='\0';Position++) Chaine[Position]=Chaine[Position+1]; } void Inserer_caractere(char * Chaine, char Lettre, byte Position) // Insertion d'une LETTRE … une certaine POSITION // dans une CHAINE d'une certaine TAILLE. { char Char_tempo; for (;Lettre!='\0';Position++) { // On m‚morise le caractŠre qui se trouve en "Position" Char_tempo=Chaine[Position]; // On splotch la lettre … ins‚rer Chaine[Position]=Lettre; // On place le caractŠre m‚moris‚ dans "Lettre" comme nouvelle lettre … ins‚rer Lettre=Char_tempo; } // On termine la chaine Chaine[Position]='\0'; } void Rafficher_toute_la_chaine(word Pos_X,word Pos_Y,char * Chaine,byte Position) { Print_dans_fenetre(Pos_X,Pos_Y,Chaine,COULEUR_TEXTE,COULEUR_FOND); Print_char_dans_fenetre(Pos_X+(Position<<3),Pos_Y,Chaine[Position],COULEUR_TEXTE_CURSEUR,COULEUR_FOND_CURSEUR); } //**************************************************************************** //* Enhanced super scanf deluxe pro plus giga mieux :-) * //**************************************************************************** byte Readline(word Pos_X,word Pos_Y,char * Chaine,byte Taille_maxi,byte Type_saisie) // ParamŠtres: // Pos_X, Pos_Y : Coordonn‚es de la saisie dans la fenˆtre // Chaine : ChaŒne recevant la saisie (et contenant ‚ventuellement une valeur initiale) // Taille_maxi : Nombre de caractŠres logeant dans la zone de saisie // Type_saisie : 0=ChaŒne, 1=Nombre, 2=Nom de fichier (12 carcactŠres) // Sortie: // 0: Sortie par annulation (Esc.) / 1: sortie par acceptation (Return) { char Chaine_initiale[256]; byte Position; byte Taille; char Touche_lue=0; byte Touche_autorisee; // Effacement de la chaŒne Block(Fenetre_Pos_X+(Pos_X*Menu_Facteur_X),Fenetre_Pos_Y+(Pos_Y*Menu_Facteur_Y), Taille_maxi*(Menu_Facteur_X<<3),(Menu_Facteur_Y<<3),COULEUR_FOND); // Mise … jour des variables se rapportant … la chaŒne en fonction de la chaŒne initiale strcpy(Chaine_initiale,Chaine); if (Type_saisie==1) itoa(atoi(Chaine),Chaine,10); // On tasse la chaine … gauche // Chaine[0]='\0'; // On efface la chaŒne si c'est valeur num‚rique Taille=strlen(Chaine); Position=(Taille=' ') Touche_autorisee=1; break; case 1 : // Nombre if ( (Touche_lue>='0') && (Touche_lue<='9') ) Touche_autorisee=1; break; default : // Nom de fichier // On commence par passez la lettre en majuscule if ( (Touche_lue>='a') && (Touche_lue<='z') ) Touche_lue-=32; // Ensuite on regarde si la touche est autoris‚e if ( (Touche_lue> ' ') && (Touche_lue!='+') && (Touche_lue!='\\') && (Touche_lue!='>') && (Touche_lue!='<') && (Touche_lue!='*') && (Touche_lue!='?') && (Touche_lue!=':') && (Touche_lue!='|') && (Touche_lue!='/') && (Touche_lue!='"') && (Touche_lue!='=') && (Touche_lue!=',') && (Touche_lue!=';') && (Touche_lue!='[') && (Touche_lue!=']') ) Touche_autorisee=1; } // Fin du "switch(Type_saisie)" // Si la touche ‚tait autoris‚e... if (Touche_autorisee) { // ... alors on l'insŠre ... Inserer_caractere(Chaine,Touche_lue,Position/*,Taille*/); // ce qui augmente la taille de la chaine Taille++; // et qui risque de d‚placer le curseur vers la droite if (Taille