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;

    }

  }

}