Gestion de la saisie clavier
// routine de saisie de caractères #include <conio.h> #include <dos.h> #include <stdio.h> #include <string.h> #include "saisie.h" int Saisie_clavier (int vide, int lmax, char *chaine, char *val_defaut, int mode) // vide : VIDE_OK chaine quelconque // NON_VIDE chaine non vide // lmax : longueur maximale // résultat : longueur chaine // -1 sur alt return et mode 1 // Val_defaut : donne la valeur acceptée si simple validation { int ch; // Caractère saisie au clavier char efface[LONG_CHAINE_MAX]; // Caracteres effacés int nb_car = 0; // Nombre de caracteres dans la chaine int nb_del = 0; // Nombre de caracteres effaces int i, oldx, oldy; static int insert = 1; chaine[0] = 0; printf ("%s", FLECHE); clreol (); if (val_defaut != NULL) { // charge la valeur par defaut nb_del = strlen (val_defaut); for (i=0; i<nb_del; i++) { efface[i] = val_defaut[nb_del - i - 1]; } efface[nb_del]=0; oldx = wherex (); oldy = wherey (); printf ("%s",val_defaut); gotoxy (oldx,oldy); } _setcursortype (insert + 1); while (1) { ch = getch (); if ( ch == 0) { ch = 1000 + getch (); } switch (ch) { case FL_GA : if ( nb_car > 0 ) { efface[nb_del++] = chaine[--nb_car]; putch (DELETE); } break; case FL_DR : if ( nb_car < lmax ) { if ( nb_del > 0 ) { putch ( chaine[nb_car++] = efface[--nb_del] ); } else { putch ( chaine[nb_car++] = ' ' ); } } break; case FIN : while (nb_del > 0) { putch (chaine[nb_car++] = efface[--nb_del] ); } break; case HOME : while (nb_car > 0) { efface[nb_del++] = chaine[--nb_car]; putch (DELETE); } break; case SUPPR : if ( nb_del > 0 ) { oldx = wherex (); oldy = wherey (); for ( i = nb_del - 2; i >= 0; i--) { putch ( efface[i] ); } putch (' '); nb_del--; gotoxy (oldx,oldy); } break; case INSERT : insert = !insert; _setcursortype (insert + 1); break; case DELETE : if ( nb_car > 0 ) { nb_car--; putch (DELETE); if ( nb_del > 0 ) { oldx = wherex (); oldy = wherey (); for ( i = nb_del - 1; i >= 0; i--) { putch ( efface[i] ); } putch (' '); gotoxy (oldx,oldy); } else { putch (' '); putch (DELETE); } } break; case CTRL_SUP : oldx = wherex (); oldy = wherey (); while ( nb_del > 0 ) { putch (' '); nb_del--; } gotoxy (oldx,oldy); break; case ESCAPE : chaine [0] = 27; chaine [1] = 0; _setcursortype (_NOCURSOR); return 1; case ALT_RETURN : if ( mode != 0 ) { _setcursortype (_NOCURSOR); return -1; } case RETURN : if ( ((nb_car+nb_del) != 0) || (vide != NON_VIDE) ) { while ( nb_del > 0 ) { putch ( chaine[nb_car++] = efface[--nb_del] ); } chaine [nb_car] = 0; _setcursortype (_NOCURSOR); return nb_car; } break; default : if ( (ch < 1000) && ((ch >= ' ') || (ch < 0) ) && (nb_car < lmax)) { putch ( chaine[nb_car++] = ch ); if ( insert ) { if ( (nb_car + nb_del) > lmax ) { nb_del--; } oldx = wherex (); oldy = wherey (); for ( i = nb_del -1; i >= 0; i-- ) { putch ( efface[i] ); } gotoxy (oldx, oldy); } else { if ( nb_del > 0 ) { nb_del--; } } } break; } } }