Règles du forum

Le langage Ada uniquement, pas les compilateurs. Les questions de sémantique et de langage et les questions techniques liées à une application en particulier, son deux choses différentes. Si nécessaire, un forum sur GNAT et les autres compilateurs, tel JanusAda, sera ouvert.

Auteur Message
Beau Parleur
Avatar de l’utilisateur
Bonjour,
J'ai un problème, je voudrais sauter les séquence d'échappement dans un flux de donnée en entrée du clavier.

J'ai testé le code Rosetta input/Flush Ada qui ne fonctionne pas sur ma machine.

Je suis sur Gnu/Linux Debian avec gcc-4.9.

Merci pour votre aide.
Merci Hibou.
Bonjour d'ailleurs.
Profil
Administrateur
Avatar de l’utilisateur
Emmanuel Sens a écrit : 
Bonjour,
J'ai un problème, je voudrais sauter les séquence d'échappement dans un flux de donnée en entrée du clavier.
[…]

Quelles séquences d’échappement ? Genre les commandes ANSI ?

Sauter une séquence en particulier et vider le cache, ce sont deux choses différentes. Tu veux vider le cache en pensant que c’est la meilleure manière de sauter certaines séquences ou l’inverse, tu penses que sauter certaines séquences est la meilleure manière de vider le cache ?
Profil
Beau Parleur
Avatar de l’utilisateur
Genre ce qui rentre lorsque je tape F1 à F12, ou les flèche ou page up down, end, begin, etc.

Toutes ces touche sont des séquence précédées du caractère 27.
C'est pour ça que je les appelle des séquence d'échappement.

Je voudrais les ignorer lors de mon Wide_Text_Io.Get_Immediate().
Profil
Administrateur
Avatar de l’utilisateur
Alors ce n’est pas une vidage de tampon, c’est un filtrage.

Il faudrait pouvoir reconnaitre les séquences, et pour cela, connaitre leur format. Je crois que dans ANSI_Console, que tu connais, il y a quelques pistes pour ça.

Sous réserve que je comprends bien le problème …
Profil
Beau Parleur
Avatar de l’utilisateur
En fait, mon réel problème avant de vouloir ignorer ces séquence, c'est que je ne parviens pas à les faire passer à ma tache qui construit la ligne de saisie.

Soit ce code :

Source ada : 

loop

declare
Wchar : Wide_Character;
begin
Get_Immediate(WChar);
Console.Receive(Wchar);
exception

when End_Error =>

Console.Stop;
Air_Tasking.Stop;
exit;
end;

end loop;


Qui doit passer le Wide_Character à la tache console dont voici l'entrée Receive(WChar : in Wide_Character);
Dans le cas d'un Wide_Character'val(10) je mets la ligne dans un tableau d'un element de type accès à Wide_String.

Source ada : 

Put(Wide_Character'Val(13) & ((Char_Max+2) * Wide_Space) & Wide_Character'Val(13) & "# " & Line.all);           
select
when Input_Page.Last = 0 =>
accept Receive(WChar : in Wide_Character) do
if Is_Control(WChar) then
case WChar is
when Wide_Character'Val(10) =>
if Line'Length > 0 and Line'length < Char_Max then
Input_Lock.Seize;
Free(Input_Page.Buffer(Input_Page.Buffer'First));
Input_Page.Buffer(Input_Page.Last + 1) := new Wide_String ' (Line.all & WChar);
Input_Page.Last := Input_Page.Last + 1;
Free(Line);
Line := new Wide_String ' ("");
Input_Lock.Release;
New_Line;
else
Put(wide_Character'val(7));
end if;

when Wide_Character'Val(12) =>
Clear_Errno := System("clear" & Ascii.Nul);
when Wide_Character'Val(127) =>
if Line'length > 0 then
Free(Buffer);
Buffer := new Wide_String ' (Line(Line'First..Line'Last-1));
Free(Line);
Line := new Wide_String ' (Buffer.all);
else
Put(wide_Character'val(7));
end if;
when Wide_Character'Val(9) =>
if Line'Last + 4 <= Char_Max then
Free(Buffer);
Buffer := new Wide_String ' (Line.all & ((4 * Wide_Space)));
Free(Line);
Line := new Wide_String ' (Buffer.all);
else
Put(wide_Character'val(7));
end if;
when others =>
if Line'Last < Char_Max then
Free(Buffer);
Buffer := new Wide_String ' (Line.all & WChar);
Free(Line);
Line := new Wide_String ' (Buffer.all);
else
Put(wide_Character'val(7));
end if;
end case;
else
if Line'Last < Char_Max then
Free(Buffer);
Buffer := new Wide_String ' (Line.all & WChar);
Free(Line);
Line := new Wide_String ' (Buffer.all);
else
Put(wide_Character'val(7));
end if;
end if;
end Receive;

or
accept Stop;
exit;
or
accept Halt;
End_Of_Task := True;
exit;
end select;



Des que j'appuye sur une de ces touche le rogramme plante.
Profil
Administrateur
Avatar de l’utilisateur
Emmanuel Sens a écrit : 
Des que j'appuye sur une de ces touche le rogramme plante.

Il plante comment ? Il ne répond plus / gèle ou il produit une opération invalide ?

En marge, il faut vraiment que je corrige ce problème de mise en page avec les balises Code trop larges …  Oops, n’a fait une bêtise
Profil
Beau Parleur
Avatar de l’utilisateur
Non, je répond pas à des question comme ça
Planter, le programme s'arrête. Sans sortir. bref, on pourait y passer des années.
Profil
Beau Parleur
Avatar de l’utilisateur
Avec des Character et des String à la place des Wide Character et Wide_String, ça marche.

Je suis vert.
Profil
Beau Parleur
Avatar de l’utilisateur
Alors, je ne parviens toujours pas à vider le tampon du clavier.
Par contre avec les character, j'arrive, en ignorant le caractère 27, à passer le reste de la séquence pour construire la ligne.

Mais j'aurais bien aimé utiliser des Wide.
Profil
Administrateur
Avatar de l’utilisateur
Emmanuel Sens a écrit : 
Avec des Character et des String à la place des Wide Character et Wide_String, ça marche.

Ça sent le problème d’allocation de mémoire.

Tu exécutes le programme après l’avoir compilé avec les instructions de contrôle des bornes ?
Profil