Nous voyons que l’affichage dans la console Linux est
tristounet et rien ne permet dans l’appel system WRITE de modifier les couleurs
des caractères à afficher. Mais comme souvent en informatique il y a une solution :
c’est d’utiliser les caractères de contrôle standards qui permettent de jouer
avec le strict affichage d’une chaine.
Je vous renvoie donc sur des cours et des présentations des
caractères possibles sur Internet par exemple :
http://manpagesfr.free.fr/man/man4/console_codes.4.html
Voici un petit programme qui montre quelques utilisations.
Lien vers le source du programme
Tout d’abord nous déclarons différentes lignes de messages à
afficher. La zone sMessFinal commence par la suite de caractères de contrôle
« \033[0m » ce qui indique au système d’affichage de réinitialiser la
couleur de l’affichage. Ensuite nous déclarons une série de codes pour modifier
la couleur de la ligne affichée ainsi qu’une suite de caractères pour effacer
la console (Clear).
Dans la partie code, nous commençons par afficher la série
de code qui permet d’effacer l’écran en les passant à notre sous-routine
d’affichage (voir les chapitres précédents). Puis nous entrons dans une boucle
qui va afficher le message de demande de saisie puis effectuer l’appel système
pour lire la chaine saisie au clavier et qui sera stockée dans le buffer.
Ensuite pour déterminer l’action à accomplir, nous devons comparer 2
chaines : celle saisie et celle stockée en mémoire et qui contient le nom
de la couleur. Nous écrivons une sous routine comparaison qui balaye les
caractères de chaque chaine et qui retourne 0 si les 2 chaines sont égales ou
-1 autrement. La comparaison s’arrête lorsque nous rencontrons le caractère 0
binaire. Mais il nous faut régler un petit problème : comme nous l’avons
vu au chapitre précédent, la chaine saisie se termine par 0A hexa et donc il
nous faut remplacer ce caractère par 0 binaire pour que notre sous routine
fonctionne correctement. Heureusement l’appel système READ retourne dans le
registre r0 le nombre de caractères lus. Il nous suffit donc de faire -1 sur ce
registre puis de l’ajouter à l »adresse de début du buffer pour avoir la position
exacte du caractère 0A et ainsi de le remplacer par 0.
Ensuite, nous avons une série de tests pour déterminer
quelle couleur a été choisie et afficher le code correspondant avant d’afficher
le libelle de la couleur saisie. Si la couleur n’est pas définie dans notre
programme, nous affichons un message indicatif. Après l’affichage nous bouclons
jusqu’à ce que l’utilisateur saisisse le mot fin. Ah oui aussi, nous comptons
le nombre de saisies dans le registre r6 et nous affichons ce compteur en fin
de programme. Bien sûr il a fallu le convertir en caractères ascii et en
décimal par une sous-routine que nous avons vu précédemment.
Lors de mes tests, j’ai laissé l’affichage mémoire de la
zone du buffer et je me suis aperçu que si l’on saisit une chaine plus courte
que la saisie précédente, le buffer contient les caractères supplémentaires. Ceci
peut entrainer des effets secondaires si la fin de la chaine est mal testée.
Exercices :
Compléter le programme avec d’autres couleurs.
Modifier le programme avec d’autres codes de
contrôle (tabulation par exemple, couleur de fond etc.).
Ce programme ne gère pas la différence majuscules/minuscules, le modifier pour qu'l fonctionne quelle que soit la saisie.
Aucun commentaire:
Enregistrer un commentaire