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