/************************************************************************ * * * READLINE (procédure permettant de saisir une chaîne de caractères) * * * ************************************************************************/ #include #include #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 // 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'; } int CaractereValide(int Caractere) { // Sous Linux: Seul le / est strictement interdit, mais beaucoup // d'autres poseront des problèmes au shell, alors on évite. // Sous Windows : c'est moins grave car le fopen() échouerait de toutes façons. #ifdef __linux__ char CaracteresInterdits[] = {'/', '|', '?', '*', '<', '>'}; #else char CaracteresInterdits[] = {'/', '|', '?', '*', '<', '>', ':', '\\'}; #endif if (Caractere < ' ' || Caractere > 255) return 0; int Position; for (Position=0; Position=' ' && Touche_lue<= 255) Touche_autorisee=1; break; case 1 : // Nombre if ( (Touche_lue>='0') && (Touche_lue<='9') ) Touche_autorisee=1; break; default : // Nom de fichier // On regarde si la touche est autorisée if ( CaractereValide(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