Pour terminer ces travaux pratiques, nous allons implanter notre propre version de quelques commandes Unix bien connues.
Nous travallerons dans le répertoire mcu/, mes commandes Unix, de notre dépôt.
Un filtre est une commande qui lit un texte à traiter sur son entre standard (stdin), produit son résultat sur la sortie standard (stdout), et produit éventuellement des messages d’erreur — dans l’idéal sur la sortie d’erreur (stderr). De plus, un filtre retourne 0 s’il se termine correctement et un code d’erreur dans le cas contraire.
Pour faire simple, nous n’allons implanter que des filtres ne prenant aucune option et qui traitent l’entrée standard ligne par ligne. On convient que nos versions basiques de ces commandes considérent que les lignes font au plus 80 caractéres. Si l’entrée standard fournie contient une ligne de plus de 80 caractères, le filtre se termine sur un échec et le code d’erreur retourné est 1.
Nous allons implanter des versions simplifiées des commandes unix suivantes :
bash$ echo "la vie est belle" | mcu_rev elleb tse eiv al bash$
bash$ echo "Hello" > essai bash$ for((i=0;i<5;i++));do echo "Hello World" >> essai ;done; bash$ mcu_uniq < essai Hello Hello World bash$
bash$ echo "Hello Unix World !" | ./mcu_xxd 000: 4865 6c6c 6f20 556e 6978 2057 6f72 6c64 Hello Unix World 010: 2021 0a !. bash$
La compilation et la mise à jour des exécutables en fonction des évolutions du code se fera en utilisant la commande make. Vous devez donc construire le makefile correspondant au fur et à mesure des exercices.
Nous allons commencer par coder des fonctions qui vont être utilisées dans plusieurs exécutables que nous devons implanter. Pour décrire ces fonctions, nous indiquons ci-dessous une partie des fichiers d’entêtes contenant leurs prototypes et des macros utiles :
après la compilation :bash$ ./mcu_test < mcu_test.c ; echo "le code de retour est $?" #include <stdio.h> 18 1==1 is true le code de retour est 2 bash$
bash$ make mcu_test gcc -c mcu_affiche_entier.c gcc -c mcu_fatal.c gcc -c mcu_readl.c gcc -c test.c gcc -o test mcu_affiche_entier.o mcu_fatal.o mcu_readl.o test.o bash$
Le filtre mcu_wc est très simple alors que le filtre mcu_ww nécessite plus de technique comme l’utilisation d’un automate simple.bash$ echo "Hello Unix World!" | ./mcu_wc 18 bash$ echo "Hello unix World!" | ./mcu_ww 3 bash$
Pensez à vérifier votre code. Par exemple :
bash$ echo "`wc -c < mcu_wc.c` - `./mcu_wc < mcu_wc.c`" | bc 0
Implanter les filtres mcu_wc et mcu_ww.
bash$ echo "Hello World," > essai bash$ echo "Hello Unix World!" >> essai bash$ ./mcu_wl < essai 2 bash$ ./mcu_rev < essai ,dlrow olleH !dlroW xinU olleH bash$
Implanter les filtres mcu_wl puis mcu_rec.
bash$ ./mcu_xxd < essai 00000000: 4865 6c6c 6f20 776f 726c 642c 0a48 656c Hello world,.Hel 00000010: 6c6f 2055 6e69 7820 576f 726c 6421 0a lo Unix World!. bash$
Implanter le filtre mcu_xxd décrit précédemmment.
Pour faire simple, vous pouvez lire les caractères et remplir un tampon (i.e. un tableau de caractères) en ajoutant au fur et à mesure les champs nécessaires. Lorsque ce tampon est plein, vous devez retourner ce tampon sur la sortie standard.