Devoir de vacances à rendre pour le 30 avril 2009, 12:00:00

A rendre par email à vos chargés de TD sous la forme d'un fichier texte brut (.txt)

Veuillez vous identifier clairement dans le fichier .txt


1- Simulation de hexdump

Le programme hexdump permet de lister le contenu d'un fichier. Il permet par exemple de retrouver si un fichier contient des caractères "non imprimables".

Voici un exemple d'execution avec l'option -C :

$ hexdump -C essai2.c
00000000  23 69 6e 63 6c 75 64 65  3c 73 74 64 69 6f 2e 68  |#include<stdio.h|
00000010  3e 0a 0a 69 6e 74 33 32  20 5f 5f 61 74 74 72 69  |>..int32 __attri|
00000020  62 75 74 65 5f 5f 20 66  6f 6f 28 69 6e 74 33 32  |bute__ foo(int32|
00000030  2a 20 78 2c 20 69 6e 74  33 32 20 69 6e 63 29 0a  |* x, int32 inc).|
00000040  7b 0a 20 20 61 73 6d 20  76 6f 6c 61 74 69 6c 65  |{.  asm volatile|
00000050  20 28 0a 20 20 20 20 20  20 20 20 22 6c 6f 63 6b  | (.        "lock|
00000060  20 78 61 64 64 20 25 30  2c 25 31 22 0a 20 20 20  | xadd %0,%1".   |
00000070  20 20 20 20 20 3a 20 22  3d 72 22 20 28 69 6e 63  |     : "=r" (inc|
00000080  29 2c 20 22 3d 6d 22 20  28 2a 78 29 0a 20 20 20  |), "=m" (*x).   |
00000090  20 20 20 20 20 3a 20 22  30 22 20 28 69 6e 63 29  |     : "0" (inc)|
000000a0  0a 20 20 20 20 20 20 20  20 3a 20 22 6d 65 6d 6f  |.        : "memo|
000000b0  72 79 22 29 3b 0a 20 20  72 65 74 75 72 6e 20 69  |ry");.  return i|
000000c0  6e 63 3b 0a 7d 0a 0a 0a  69 6e 74 0a 6d 61 69 6e  |nc;.}...int.main|
000000d0  28 29 0a 7b 0a 20 20 69  6e 74 20 69 3d 30 2c 73  |().{.  int i=0,s|
000000e0  3d 30 3b 0a 0a 20 20 66  6f 72 28 69 3d 30 3b 69  |=0;..  for(i=0;i|
000000f0  3c 31 30 3b 69 2b 2b 29  20 73 20 2b 3d 20 31 3b  |<10;i++) s += 1;|
00000100  0a 0a 20 20 73 3d 66 6f  6f 28 73 2c 31 30 30 30  |..  s=foo(s,1000|
00000110  30 29 3b 0a 0a 20 20 70  72 69 6e 74 66 28 22 25  |0);..  printf("%|
00000120  64 5c 6e 22 2c 73 29 3b  0a 20 20 72 65 74 75 72  |d\n",s);.  retur|
00000130  6e 20 73 3b 0a 7d 0a                              |n s;.}.|
00000137

La colonne de gauche donne (en codage hexadécimal) les décalages (les adresses par rapport au début du fichier) des caractères de cette ligne dans le fichier ; les 16 valeurs hexadécimales suivantes désignent les caractères qui sont dans le fichier à partir de ce décalage. Les mêmes apparaissent "en clair" sur la droite.

On vous demande d'écrire un script bash qui prend en paramètre un fichier, qui vérifie si le fichier existe (et a les droits de lecture), et qui va produire la même sortie que la commande hexdump -C pour ce fichier.

Pour cela on développera un programme C gethex qui reçoit un nom de fichier sur la liste de commande et qui se charge d'écrire à l'écran (sa sortie standard) en hexadécimal les codes ascii des caractères du fichier (pour l'exemple ci-dessus, il écrit la liste "23 69 6e 63 6c 75 64 65 3c 73 74 .....6e 20 73 3b 0a 7d 0a"). Le script bash interceptera les codes produits par gethex dans un for i in <liste> do ..... done afin de présenter les informations comme ci dessus.

2- Reprise d'un code

Lire le sujet et la correction de l'exercice 3 disponible en ligne sous http://www-lipn.univ-paris13.fr/~cerin/SE/Examen10122007.pdf

On vous demande :

- de modifier le code pour accepter des valeurs réelles dans les colonnes

- d'afficher à la fin la moyenne des valeurs présentes sur la première et deuxième colonne. Il y a donc 2 valeurs à produire : moyenne des valeurs présentes sur la première colonne et moyenne des valeurs présentes sur la deuxième colonne)




Des éléments de correction ici (version technique). Voir aussi le répertoire devoir_maison_yassine_belmehel/Simulation_hexdump et veuillez retravailler sur hexdump.sh : quand on passe gethex.c en paramètre, il y a des problèmes avec les caractères de tabulation par exemple. Cependant ce code est particulièrement précieux car l'approche n'est pas la même que pour le précédent code. Pour une correction de la deuxième question du sujet, veuillez vous reporter à devoir_maison_yassine_belmehel/Reprise_dun_code. La principale critique de ce code est qu'il utilise trop de fichiers intermédiaires : cherchez une solution avec une seule passe sur le fichier d'entrée. HINT : remplacez le break par un traitement approprié (en sortie de boucle).