:: miniprojet libstream ::
Groupe de News: epita.cours.c-unix.libstream
Date de rendu: mardi 15 Octobre 2002 - 23:42
Repertoire de rendu: ~/c/rendu/mp/libstream/
Droits sur le rep et les exos : 705 sur les répertoires,
705 sur "configure" s'il existe,
604 pour les fichiers,
au moins 701 sur ~
(modalités de rendu en fin de sujet)
--------------------
Fonctions autorisées
--------------------
open(2) close(2) read(2) write(2) lseek(2) malloc(3) free(3)
assert(3)
-----------
Description
-----------
Votre bibliothèque doit gérer des entrées/sorties tamponnées. (dites
<< bufferisées >>).
Pour comprendre le fonctionnement attendu des différentes fonctions,
consultez leur pages du manuel respectives (supprimez simplement le
prefix ``my_'' pour avoir la page de manuel correspondante). Le type
FILE est remplacé par un type t_my_file que vous définirez vous-même.
Votre bibliothèque doit contenir au moins les fonctions suivantes :
(prototypes:)
t_my_file *my_fopen(const char *path,
const char *mode);
int my_fclose(t_my_file *stream);
int my_fputc(int c, t_my_file *stream);
int my_fgetc(t_my_file *stream);
Une fois ces fonctions implémentées, vous devez, incrémentalement,
fournir les fonctions suivantes :
Niveau 1
--------
size_t my_fread(void *ptr,
size_t size,
size_t nmemb,
t_my_file *stream);
size_t my_fwrite(const void *ptr,
size_t size,
size_t nmemb,
t_my_file *stream);
char *my_fgets(char *str,
int size,
t_my_file *stream);
int my_fputs(const char *str,
t_my_file *stream);
int my_fflush(t_my_file *stream);
Vous n'avez pas implémenter le comportement de my_fflush(NULL) à ce
niveau.
Niveau 2
--------
int my_fseek(t_my_file *stream,
long offset,
int whence);
long my_ftell(t_my_file *stream);
void my_rewind(t_my_file *stream);
int my_fgetpos(t_my_file *stream,
fpos_t *pos);
int my_fsetpos(t_my_file *stream,
const fpos_t *pos);
Niveau 3
--------
t_my_file *my_fdopen(int fildes,
const char *mode);
t_my_file *my_freopen(const char *path,
const char *mode,
t_my_file *stream);
Par ailleurs, au niveau 3, vous devez implémenter le comportement de
my_fflush(NULL).
À chaque niveau, TOUTES les fonctions doivent êtres implémentées.
---------------------------------
Modalités de rendu et contraintes
---------------------------------
Votre répertoire de rendu doit contenir vos sources, un fichier
Makefile, et optionnellement un script configure.
Votre Makefile doit construire une bibliothèque contenant les
fonctions que vous aurez implémentées, sous la forme d'une archive
autonome de nom :
libstream_`uname -m`-`uname -s`.a
Par ailleurs, vous devez utiliser les constantes symboliques
suivantes :
MY_READ_SIZE
MY_WRITE_SIZE
La définition de ces constantes symboliques, et elles seules, doivent
se trouver dans un fichier séparé appelé "libstream_defines.h", situé
à la racine du répertoire de rendu.
Attention, ce fichier ne devra contenir que ces deux définitions, il
sera écrasé lors de la correction pour changer les valeurs numériques
associées.
À titre d'exemple, vous pouvez utiliser les définitions suivantes :
#define MY_READ_SIZE 8192
#define MY_WRITE_SIZE 8192
Les autres modalités de rendu (règles de Makefile, options de
compilation), ainsi que vos sources, doivent être conformes aux
spécification correspondantes du CSS (<< norme >>).
---------
Remarques
---------
* Vous devez implémenter au moins le comportement ANSI de ces
fonctions. Si vous implémentez des extensions non-ANSI, elles ne
seront pas testées.
* L'archive doit être _autonome_, c'est-à-dire qu'elle doit contenir
les fonctions de la libmy que vous utilisez.
* Le code d'erreur EOF est défini dans l'en-tête de déclarations
standard stdio.h, que vous pouvez inclure UNIQUEMENT pour obtenir
cette définition.
* Pour obtenir les déclarations standard des fonctions autorisées, vous
pouvez inclure unistd.h.
* Pour utiliser la constante symbolique NULL ou le type standard
size_t, utilisez stdlib.h pour en obtenir la définition.
* pour utiliser la fonction open(), vous pouvez inclure le fichier
fcntl.h.
* N'oubliez pas le fichier AUTHORS, spécifié dans le CSS.
* Vous ne _devez_ pas utiliser de variable globale, ou de variable
`static' hors d'une fonction. Vous ne connaissez pas le nombre
maximum de fichiers qui peuvent être ouverts simultanément.
|