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;
}
}
}