IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Vérification à la volée ou après enter ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 88
    Par défaut Vérification à la volée ou après enter ?
    Bonjour,

    Une p'tite question : à votre avis, pour analyser une ligne de commande dans un mini-shell, il vaut mieux effectuer l'analyse à la volée avec un getchar ou plutôt attendre que l'utilisateur ait appuyé sur enter (getopt)?

    C'est bête comme question, mais je ne sais vraiment pas vers quelle solution m'orienter.
    Bon c'est vrai que getopt est puissant, mais si je veux faire de la complémentation il vaut mieux que je travaille en live ?

    Merci de vos avis

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: Vérification à la volée ou après enter ?
    Citation Envoyé par laurent_ifips
    Une p'tite question : à votre avis, pour analyser une ligne de commande dans un mini-shell, il vaut mieux effectuer l'analyse à la volée avec un getchar ou plutôt attendre que l'utilisateur ait appuyé sur enter (getopt)?

    C'est bête comme question <...>
    Oui, par ce que de toutes façons, on ne peut rien faire (en standard) avant d'avoir tapé enter...
    Bon c'est vrai que getopt est puissant, mais si je veux faire de la complémentation il vaut mieux que je travaille en live ?
    Si tu veux faire de la saisie 'à-la-volée, il faut utiliser des saisies directes avec les extensions qui vont bien (conio, ou read() en desactivant le mode canonique... Ca dépend du système...)

  3. #3
    Membre chevronné Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Par défaut Re: Vérification à la volée ou après enter ?
    Citation Envoyé par laurent_ifips
    Bonjour,

    Une p'tite question : à votre avis, pour analyser une ligne de commande dans un mini-shell, il vaut mieux effectuer l'analyse à la volée avec un getchar ou plutôt attendre que l'utilisateur ait appuyé sur enter (getopt)?

    C'est bête comme question, mais je ne sais vraiment pas vers quelle solution m'orienter.
    Bon c'est vrai que getopt est puissant, mais si je veux faire de la complémentation il vaut mieux que je travaille en live ?

    Merci de vos avis
    Pour ton minishell, si il doit tourner sur un Unix, pour pouvoir faire des operations comme la completion, la modification de la ligne "en live" il faut que tu desactive la bufferisation de l'entree -> mode non-canonique.

    Regardes du cote de ioctl(), et de termios().

    Pour desactiver la bufferisation sous Unix :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    #include <sys/termios.h>
    #include <sys/ioctl.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    int			main(void)
    {
      struct termios	line_police;
     
      if (ioctl(0, TIOCGETA, &line_police) < 0)
        {
          perror("Oh oh");
          exit(1);
        }
      line_police.c_lflag &=  ~ICANON;
      if ((ioctl(0, TIOCSETA, &line_police)) < 0)
        {
          perror("Oh, oh");
          exit(2);
        }
     
      /*
      ** Do what you want here
      */
     
      return (0);
    }
    P.S.: penses a la reactiver apres.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 88
    Par défaut
    Cool merci beaucoup pour ces pistes.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 88
    Par défaut
    Ok, ca marche super en mode non-canonique, par contre, pour la completion automatique, la liste des programmes existants sur le poste (je suis en linux) je dois d'abord l'initialiser à partir d'un fichier ou ya moyen de la monter dynamiquement ?
    Euh, comment je peux émuler la touche érase en mode non-canonique ?

    Voila, j'en suis là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    #include <stdio.h>
    #include <termio.h>
    #include <unistd.h>
    int reconfigure_terminal (struct termios *prev)
    {
        struct termios new;
        if (tcgetattr(fileno(stdin),prev)==-1) {
            perror("tcgetattr");
            return -1;
        }
        new.c_iflag=prev->c_iflag;
        new.c_oflag=prev->c_oflag;
        new.c_cflag=prev->c_cflag;
        new.c_lflag=ECHO;
        new.c_cc[VMIN]=1;
        new.c_cc[VTIME]=0;
        new.c_cc[VERASE]=1;
        if (tcsetattr(fileno(stdin),TCSANOW,&new)==-1) {
            perror("tcsetattr");
            return -1;
        }
        return 0;
    }
     
    int restaure_terminal (struct termios *prev)
    {
        return tcsetattr(fileno(stdin),TCSANOW,prev);
    }
     
    int main (int argc,char *argv[])
    {
        struct termios prev;
        int c;
        if (reconfigure_terminal(&prev)==-1) return 1;
     
        printf("monshell#");
        for (;;) {
            c=getchar();
            nb++;
            if (c==4) {    // CTRL+D
                printf("EXIT\n");
                break;
            }
            if (c==10) printf("monshell#");
            if (c==127) printf("EFFACE BON SANG");
         }
         if (restaure_terminal(&prev)==-1) return 1;
         return 0;
    }
    Merci d'avance

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par laurent_ifips
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            c=getchar();
            nb++;
            if (c==4) {    // CTRL+D
                printf("EXIT\n");
                break;
            }
            if (c==10) printf("monshell#");
            if (c==127) printf("EFFACE BON SANG");
    Huh ! Jamais entendu parlé de switch-case ?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 88
    Par défaut
    Lol, j'ai essayé mais ca ne change rien

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par laurent_ifips
    Euh, comment je peux émuler la touche érase en mode non-canonique ?
    C'est pas le code ASCII 8 (BasckSpace) ou alors ASCII 127 (Delete) ?

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 88
    Par défaut
    Bon, je sais pas si c'est 'propre' mais j'émule le erase avec ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (c==127) printf("\033[1D\033[K");
    Vous en pensez quoi ?

  10. #10
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par laurent_ifips
    Bon, je sais pas si c'est 'propre' mais j'émule le erase avec ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (c==127) printf("\033[1D\033[K");
    Vous en pensez quoi ?
    C'est crade, parce que ce n'est pas logique. Tu es en mode non canonique, donc, tu es censé gérer l'effacement toi-même, et non en demandant à l'interpréteur ANSI de le faire. (il peut ne pas exister).

    En principe, un effacement se fait en émettant la séquence :

    - recule (BS)
    - efface (SPC)
    - recule (BS)

    soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       printf ("\b \b");
       fflush (stdout);
    Mais essaye d'abord \b tout seul. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       putchar ('\b');
       fflush (stdout);

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 88
    Par défaut
    Ca à l'avantage d'être clair
    J'avoue que je nage un peu, pour un vieux comme moi, reprendre les etudes et en 4 mois apprendre un langage et sortir un mini-shell, c'est chaud
    Heureusement qu'il y a des bonnes âmes

    Laurent

    PS : j'avais pensé utilisé le \b, le problème c'est que ca recule sans effacer....

  12. #12
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par laurent_ifips
    j'avais pensé utilisé le \b, le problème c'est que ca recule sans effacer....
    Et qu'est-ce que tu ne comprends pas dans
    - recule (BS)
    - efface (SPC)
    - recule (BS)

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 88
    Par défaut
    Désolé, je veux aller trop vite, ca marche

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/10/2007, 13h43
  2. accès à une image après vérification par php
    Par sakini dans le forum Langage
    Réponses: 4
    Dernier message: 19/09/2007, 21h38
  3. Réponses: 1
    Dernier message: 27/05/2007, 15h43
  4. [VBA]Vérification d'une table apres import
    Par Baya44 dans le forum VBA Access
    Réponses: 10
    Dernier message: 19/04/2007, 16h29
  5. vérification champ après champ d'un formulaire
    Par Francis_R dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 12/10/2005, 08h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo