vendredi 27 octobre 2017

Chapitre 6 : un peu de couleur



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. 
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