Oui, mais c'est quand même une grosse simplification de quelque chose qui n'était pourtant pas fondamentalement difficile de prime abord.
Ce qu'il aurait fallu, c'est que tu reconnaisses le motif qui s'affiche à l'écran quand tu tapes des touches spéciales, que tu découvres par toi-même que c'est une séquence CSI en faisant par exemple une recherche Google avec les codes que tu as lu (et qui t'auraient renvoyé des milliers de pages parce qu'ils sont extrêmement répandus) et que, de là, tu cherches d'une part la définition d'une séquence CSI et, d'autre part, son format. Il faudra ensuite que tu fasses exactement la même chose avec les autres types de trames que tu pourrais rencontrer.
Il y a une énorme erreur sur cette ligne. Peux-tu voir laquelle ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2info.c_lflag &= ~ECHO && ICANON; // ~ECHO=noecho ICANON=mode canonique (pas d'attente de entrée)
L'avantage des automates, c'est qu'il fonctionnent en observateur sans dépendre en soi de la cohérence de ton flux. Et surtout, ça te permet d'en faire fonctionner plusieurs en parallèle, chose impossible avec un algo tel que celui que tu nous présentes.Je n'utilise pas de machine à état,et mon code est à mon niveau opérationnel. Grosso-modo si la séquence est non reconnue (ne commençant pas par [ après esc ou n'étant pas flèche gauche ou F10 - les deux touches spéciales que je gère) j'ai un retour de 0.
Ce n'est pas « négligeable » : c'est un point à prendre en compte dès les premières lignes de la conception de ton programme : tu dois absolument considérer les données extérieures à ton système comme non fiables et celui-ci ne doit jamais être mis en défaut en cas d'incohérence. Sinon, c'est une faille de sécurité puisque n'importe qui peut le faire planter, éventuellement à distance, en lui envoyant des données avariées.Pour info, les erreurs de transmissions sont négligeables car je travaille en terminal virtuel (pas de liaison sérielle ou réseau)
Tu n'as pas à le gérer puisqu'il n'y a rien de tel dans le flux. C'est un artefact uniquement dû à la façon dont les codes spéciaux sont affichés à l'écran.Obsidian, je ne tiens pas compte de ton dernier paragraphe du moins dans mon code (gestion de "^"), mais ça n'en ai pas moins intéressant.
En effet. Sachant que la touche Echap sert justement, en principe, à permettre à l'utilisateur d'envoyer ce code et, donc, vaut exactement 1B. Rien ne la distingue en soi du début d'une séquence émise automatiquement par le terminal.Pour avoir un code fiable, il me faudrait gérer dans le cas d'une chaine CSI erronée sa longueur car le codee que j'ai fait tel que présenté présentera un buffer overflow en cas de non présence de caractère supérieur ou égal à 40h, et d'autre part, je ne gère pas l'appui unique sur la touche echap ce qui se présentera clairement.
Autre petit détail : les touches Home et End ne font pas partie de CSI, mais de SS3 :-)
Dans ce cas, je passe ta discussion en « résolu » quand même. Tu pourras la repasser à l'état non résolu en recliquant sur le même bouton.Pour moi mon prob est résolu, et j'ai appris plein de trucs sur le terminal.
Merci encore Obsidian pour le temps consacré et les explications détaillées. Merci également aux autres contributeurs.
Je laisse encore la discussion ouverte si qq1 à qq chose à ajouter.
Partager