Vous êtes sur la page 1sur 19

Projet du module Algorithmie I

libft

Rsum: Ce projet a pour but de vous faire coder une bibliothque de fonctions usuelles
que vous pourrez utiliser dans tous vos projets.

Table des matires


I

Prambule

II

Sujet
Partie obligatoire . . . . . . . . . . . .
II.1.1 Part 1 - Fonctions de la libc . . . .
II.1.2 Part 2 - Fonctions supplmentaires
Bonus . . . . . . . . . . . . . . . . . . .
Rendu . . . . . . . . . . . . . . . . . .
Considrations techniques . . . . . . . .
Fonctions autorises . . . . . . . . . . .

II.1

II.2
II.3
II.4
II.5

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

3
3
4
5
11
14
15
16

III

Consignes

17

IV

Notation

18

Chapitre I
Prambule
Ce premier projet marque le dbut de votre formation de dveloppeur. Profitez-en
pour lire cet article et apprenez aujourdhui que le typage est ce qui diffrencie le dveloppeur de la bte. Si vous ne comprenez pas tout ce nest pas grave. Ca viendra avec le
temps.
Pour vous accompagner musicalement tout au long de la ralisation de ce projet je
vous propose une liste de groupes dignes dinteret. Si vous naimez pas, cest que vous
avez visiblement des gouts musicaux pauvres, mais vous avez probablement dautres qualits comme avoir beaucoup damis sur Facebook ou bien pouvoir toucher votre coude
avec votre langue. Bref. Les groupes sont lists sans ordre particulier et cette liste na pas
pour but dtre exhaustive. Les liens proposs sont donns titre dexemple et vous tes
encourags explorer vous-mme leur riche discographie.
Between The Buried And Me
Tesseract
Chimp Spanner
Emancipator
Cynic
Kalisia
Porcupine Tree
Wintersun
O.S.I
Dream Theater
Pain Of Salvation
Crucified Barbara

Chapitre II
Sujet
II.1

Partie obligatoire

Le projet libft reprend le concept du jour 06 de la piscine, savoir vous faire crire
une bibliothque de fonctions utiles que vous pourrez ensuite utiliser dans la vaste majorit de vos projets de C cette anne et ainsi vous faire gagner beaucoup de temps. Ce
projet vous demande dcrire beaucoup de code que vous avez dja ralis pendant la piscine, ce qui en fait un excellent commencement pour vous remettre sur les rails puisque
vous ny apprendrez en thorie rien de nouveau. Voyez ce projet comme le moment ou
vous slectionnez ou quipez votre personnage dans un jeu vido.
Les fonctions sont raliser dans lordre que vous souhaitez et vous tes trs encourags utiliser les fonctions dja codes pour raliser les suivantes. La difficult nest pas
croissante et lordre du sujet parfaitement arbitraire. Cest un peu comme dans un jeu
vido ou vous pouvez raliser des qutes dans lordre que vous voulez et utiliser le loot
des prcdentes pour vous faciliter les suivantes.

Projet du module Algorithmie I

II.1.1

libft

Part 1 - Fonctions de la libc

Dans cette premire partie, vous devez recoder un ensemble de fonctions de la libc
telles que dcrites dans leur man respectif sur votre systme. Vos fonctions devront avoir
exactement le mme prototype et le mme comportement que les originales. Leur nom
devra tre prfix par ft_. Par exemple strlen devient ft_strlen.
Certains prototypes des fonctions que vous devez recoder utilisent
le qualifieur de type "restrict". Ce mot clef fait parti du standard
c99, vous devez donc ne pas le mettre dans vos prototypes et ne pas
compiler avec le flag -std=c99.

Vous devez recoder les fonctions suivantes :

memset
bzero
memcpy
memccpy
memmove
memchr
memcmp
strlen
strdup
strcpy
strncpy
strcat
strncat
strlcat
strchr
strrchr
strstr
strnstr
strcmp
strncmp
atoi
isalpha
isdigit
isalnum
isascii
isprint
toupper
tolower

Projet du module Algorithmie I

II.1.2

libft

Part 2 - Fonctions supplmentaires

Dans cette seconde partie, vous devrez coder un certain nombre de fonctions absentes
de la libc ou prsentes dans une forme diffrente. Certaines de ces fonctions peuvent
avoir de lintret pour faciliter lcriture des fonctions de la premire partie.

Prototype
Description

Param. #1
Retour
Fonctions libc

Prototype
Description

Param. #1
Retour
Fonctions libc

Prototype
Description

Param. #1
Retour
Fonctions libc

Prototype
Description

Param. #1
Retour
Fonctions libc

ft_memalloc
void * ft_memalloc(size_t size);
Alloue (avec malloc(3)) et retourne une zone de mmoire
fraiche. La mmoire alloue est initialise 0. Si lallocation
choue, la fonction renvoie NULL.
La taille de la zone de mmoire allouer.
La zone de mmoire alloue.
malloc(3)

ft_memdel
void ft_memdel(void **ap);
Prend en paramtre ladresse dun pointeur dont la zone pointe doit tre libre avec free(3), puis le pointeur est mis
NULL.
Ladresse dun pointeur dont il faut librer la mmoire puis le
mettre NULL.
Rien.
free(3).

ft_strnew
char * ft_strnew(size_t size);
Alloue (avec malloc(3)) et retourne une chaine de caractre
fraiche termine par un \0. Chaque caractre de la chaine
est initialis \0. Si lallocation echoue, la fonction renvoie
NULL.
La taille de la chaine de caractres allouer.
La chaine de caractres alloue et initialise 0.
malloc(3)

ft_strdel
void ft_strdel(char **as);
Prend en paramtre ladresse dune chaine de caractres qui
doit tre libre avec free(3) et son pointeur mis NULL.
Ladresse de la chaine de caractre dont il faut librer la mmoire et mettre le pointeur NULL.
Rien.
Free(3).

Projet du module Algorithmie I

Prototype
Description

Param. #1
Retour
Fonctions libc

Prototype
Description

Param. #1
Param. #2
Retour
Fonctions libc

Prototype
Description

Param. #1
Param. #2
Retour
Fonctions libc

Prototype
Description

Param. #1
Param. #2
Retour
Fonctions libc

libft

ft_strclr
void ft_strclr(char *s);
Assigne la valeur \0 tous les caractres de la chaine passe
en paramtre.
La chaine de caractres clearer.
Rien.
Aucune.

ft_striter
void ft_striter(char *s, void (*f)(char *));
Applique la fonction f chaque caractre de la chaine de
caractres passe en paramtre. Chaque caractre est pass
par adresse la fonction f afin de pouvoir tre modifi si
ncssaire.
La chaine de caractres sur laquelle itrer.
La fonction appeler sur chaque caractre de s.
Rien.
Aucune.

ft_striteri
void ft_striteri(char *s, void (*f)(unsigned int,
char *));
Applique la fonction f chaque caractre de la chaine de
caractres passe en paramtre en prcisant son index en premier argument. Chaque caractre est pass par adresse la
fonction f afin de pouvoir tre modifi si ncssaire.
La chaine de caractres sur laquelle itrer.
La fonction appeler sur chaque caractre de s et son index.
Rien.
Aucune.

ft_strmap
char * ft_strmap(char const *s, char (*f)(char));
Applique la fonction f chaque caractre de la chaine de caractres passe en paramtre pour crer une nouvelle chaine
fraiche (avec malloc(3)) rsultant des applications successives de f.
La chaine de caractres sur laquelle itrer.
La fonction appeler sur chaque caractre de s.
La chaine fraiche rsultant des applications successives de
f.
malloc(3)

Projet du module Algorithmie I

Prototype
Description

Param. #1
Param. #2
Retour
Fonctions libc

Prototype
Description

Param. #1
Param. #2
Retour
Fonctions libc

Prototype
Description

Param. #1
Param. #2
Param. #3
Retour
Fonctions libc

libft

ft_strmapi
char * ft_strmapi(char const *s, char
(*f)(unsigned int, char));
Applique la fonction f chaque caractre de la chaine de
caractres passe en paramtre en prcisant son index pour
crer une nouvelle chaine fraiche (avec malloc(3)) rsultant
des applications successives de f.
La chaine de caractres sur laquelle itrer.
La fonction appeler sur chaque caractre de s en prcisant
son index.
La chaine fraiche rsultant des applications successives de
f.
malloc(3)

ft_strequ
int ft_strequ(char const *s1, char const *s2);
Compare lexicographiquement s1 et s2. Si les deux chaines
sont gales, la fonction retourne 1, ou 0 sinon.
La premire des deux chaines comparer.
La seconde des deux chaines comparer.
1 ou 0 selon que les deux chaines sont gales ou non.
Aucune.

ft_strnequ
int ft_strnequ(char const *s1, char const *s2,
size_t n);
Compare lexicographiquement s1 et s2 jusqu n caractres
maximum ou bien quun \0 ait t rencontr. Si les deux
chaines sont gales, la fonction retourne 1, ou 0 sinon.
La premire des deux chaines comparer.
La seconde des deux chaines comparer.
Le nombre de caractres comparer au maximum.
1 ou 0 selon que les deux chaines sont gales ou non.
Aucune.

Projet du module Algorithmie I

Prototype
Description

Param. #1
Param. #2
Param. #3
Retour
Fonctions libc

Prototype
Description

Param. #1
Param. #2
Retour
Fonctions libc

Prototype
Description

Param. #1
Retour
Fonctions libc

libft

ft_strsub
char * ft_strsub(char const *s, unsigned int
start, size_t len);
Alloue (avec malloc(3)) et retourne la copie fraiche dun
tronon de la chaine de caractres passe en paramtre. Le
tronon commence lindex start et pour longueur len. Si
start et len ne dsignent pas un tronon de chaine valide,
le comportement est indtermin. Si lallocation choue, la
fonction renvoie NULL.
La chaine de caractres dans laquelle chercher le tronon
copier.
Lindex dans la chaine de caractres o dbute le tronon
copier.
La longueur du tronon copier.
Le tronon.
malloc(3)

ft_strjoin
ft_strjoin(char const *s1, char const

char *
*s2);
Alloue (avec malloc(3)) et retourne une chaine de caractres
fraiche termine par un \0 rsultant de la concatnation
de s1 et s2. Si lallocation echoue, la fonction renvoie NULL.
La chaine de caractres prfixe.
La chaine de caractres suffixe.
La chaine de caractre fraiche rsultant de la concatnation
des deux chaines.
malloc(3)

ft_strtrim
char * ft_strtrim(char const *s);
Alloue (avec malloc(3)) et retourne une copie de la chaine
passe en paramtre sans les espaces blancs au debut et la
fin de cette chaine. On considre comme espaces blancs les
caractres , \n et \t. Si s ne contient pas despaces
blancs au dbut ou la fin, la fonction renvoie une copie de
s. Si lallocation echoue, la fonction renvoie NULL.
La chaine de caractres trimmer.
La chaine de caractre fraiche trimme ou bien une copie
de s sinon.
malloc(3)

Projet du module Algorithmie I

Prototype
Description

Param. #1
Param. #2
Retour
Fonctions libc

Fonctions libc

Prototype
Description
Param. #1
Retour
Fonctions libc

ft_putchar
void ft_putchar(char c);
Affiche le caractre c sur la sortie standard.
Le caractres afficher.
Rien.
write(2).

Prototype
Description
Param. #1
Retour
Fonctions libc

ft_putstr
void ft_putstr(char const *s);
Affiche la chaine s sur la sortie standard.
La chaine de caractres afficher.
Rien.
write(2).

Param. #1
Retour

ft_strsplit
char ** ft_strsplit(char const *s, char c);
Alloue (avec malloc(3)) et retourne un tableau de chaines de
caractres fraiches (toutes termines par un \0, le tableau
galement donc) rsultant de la dcoupe de s selon le caractre
c. Si lallocation echoue, la fonction retourne NULL. Exemple :
ft_strsplit("*salut*les***etudiants*", *) renvoie
le tableau ["salut", "les", "etudiants"].
La chaine de caractres dcouper.
Le caractre selon lequel dcouper la chaine.
Le tableau de chaines de caractres fraiches rsultant de la
dcoupe.
malloc(3)

ft_itoa
char * ft_itoa(int n);
Alloue (avec malloc(3)) et retourne une chaine de caractres
fraiche termine par un \0 reprsentant lentier n pass
en paramtre. Les nombres ngatifs doivent tre grs. Si lallocation choue, la fonction renvoie NULL.
Lentier convertir en une chaine de caractres.
La chaine de caractres reprsentant lentier pass en paramtre.
malloc(3)

Prototype
Description

libft

Projet du module Algorithmie I

Prototype
Description
Param. #1
Retour
Fonctions libc

ft_putendl
void ft_putendl(char const *s);
Affiche la chaine s sur la sortie standard suivi dun \n.
La chaine de caractres afficher.
Rien.
write(2).

Prototype
Description
Param. #1
Retour
Fonctions libc

ft_putnbr
void ft_putnbr(int n);
Affiche lentier n sur la sortie standard.
Lentier afficher.
Rien.
write(2).

Prototype
Description
Param. #1
Retour
Fonctions libc

ft_putchar_fd
void ft_putchar_fd(char c, int fd);
Ecrit le caractre c sur le descripteur de fichier fd.
Le caractres crire.
Rien.
write(2).

Prototype
Description
Param. #1
Retour
Fonctions libc

ft_putstr_fd
void ft_putstr_fd(char const *s, int fd);
Ecrit la chaine s sur le descripteur de fichier fd.
La chaine de caractres crire.
Rien.
write(2).

Param. #1
Retour
Fonctions libc

ft_putendl_fd
void ft_putendl_fd(char const *s, int fd);
Ecrit la chaine s sur le descripteur de fichier fd suivi dun
\n.
La chaine de caractres crire.
Rien.
write(2).

Prototype
Description
Param. #1
Retour
Fonctions libc

ft_putnbr_fd
void ft_putnbr_fd(int n, int fd);
Ecrit lentier n sur le descripteur de fichier fd.
Lentier crire.
Rien.
write(2).

Prototype
Description

libft

10

Projet du module Algorithmie I

II.2

libft

Bonus

Si vous avez russi parfaitement la partie obligatoire, cette section propose quelques
pistes pour aller plus loin. Un peu comme quand vous achetez un pack dextension pour
un jeu vido. Les bonus seront comptabiliss si vous obtenez au moins 18/20 la partie
obligatoire.
Avoir des fonction de manipulation de mmoire brute et de chaines de caractres est
trs pratique, mais vous vous rendrez vite compte quavoir des fonctions de manipulation
de liste est encore plus pratique.
Vous utiliserez la structure suivante pour reprsenter les maillons de votre liste. Cette
structure est ajouter votre fichier libft.h.
typedef struct
{
void
size_t
struct s_list
}

s_list
*content;
content_size;
*next;
t_list;

La description des champs de la structure t_list est la suivante :


content : La donne contenue dans le maillon. Le void * permet de stocker une
donne de nimporte quel type.
content_size : La taille de la donne stocke. Le type void * ne permettant pas
de connaitre la taille de la donne pointe, il est ncessaire den sauvegarder la
taille. Par exemple la chaine de caractres "42" a une taille de 3 octets et lentier
32bits 42 a une taille de 4 octets.
next : Ladresse du maillon suivant de la liste ou NULL si le maillon est le dernier.

11

Projet du module Algorithmie I

libft

Les fonctions suivantes vous permettront de manipuler vos listes aisment.

Prototype
Description

Param. #1
Param. #2
Retour
Fonctions libc

Prototype
Description

Param. #1
Retour
Fonctions libc

Prototype
Description

Param. #1
Retour
Fonctions libc

ft_lstnew
t_list * ft_lstnew(void const *content, size_t
content_size);
Alloue (avec malloc(3)) et retourne un maillon frais. Les
champs content et content_size du nouveau maillon sont
initialiss par copie des paramtres de la fonction. Si le paramtre content est nul, le champs content est initialis
NULL et le champs content_size est initialis 0 quelque
soit la valeur du paramtre content_size. Le champ next
est initialis NULL. Si lallocation choue, la fonction renvoie
NULL.
Le contenu ajouter au nouveau maillon.
La taille du contenu ajouter au nouveau maillon.
Le nouveau maillon.
malloc(3)

ft_lstdelone
void ft_lstdelone(t_list **alst, void (*del)(void
*, size_t));
Prend en paramtre ladresse dun pointeur sur un maillon et
libre la mmoire du contenu de ce maillon avec la fonction
del passe en paramtre puis libre la mmoire du maillon
en lui mme avec free(3). La mmoire du champ next ne
doit en aucun cas tre libre. Pour terminer, le pointeur sur
le maillon maintenant libr doit tre mis NULL (de manire
similaire la fonction ft_memdel de la partie obligatoire).
Ladresse dun pointeur sur le maillon librer.
Rien.
free(3)

ft_lstdel
void ft_lstdel(t_list **alst, void (*del)(void *,
size_t));
Prend en paramtre ladresse dun pointeur sur un maillon et
libre la mmoire de ce maillon et celle de tous ses successeurs lun aprs lautre avec del et free(3). Pour terminer,
le pointeur sur le premier maillon maintenant libr doit tre
mis NULL (de manire similaire la fonction ft_memdel de
la partie obligatoire).
Ladresse dun pointeur sur le premier maillon dune liste
librer.
Rien.
free(3)

12

Projet du module Algorithmie I

Prototype
Description
Param. #1
Param. #2
Retour
Fonctions libc

Prototype
Description

Param. #1
Param. #2
Retour
Fonctions libc

Prototype
Description

Param. #1
Param. #2
Retour
Fonctions libc

libft

ft_lstadd
void ft_lstadd(t_list **alst, t_list *new);
Ajoute llment new en tte de la liste.
Ladresse dun pointeur sur le premier maillon dune liste.
Le maillon ajouter en tte de cette liste.
Rien.
Aucune.

ft_lstiter
void ft_lstiter(t_list *lst, void (*f)(t_list
*elem));
Parcourt la liste lst en appliquant chaque maillon la fonction f.
Pointeur sur le premier maillon dune liste.
Ladresse dune fonction laquelle appliquer chaque maillon
de la liste.
Rien.
Aucune.

ft_lstmap
t_list * ft_lstmap(t_list *lst, t_list *
(*f)(t_list *elem));
Parcourt la liste lst en appliquant chaque maillon la fonction f et cre une nouvelle liste fraiche avec malloc(3) rsultant des applications successives. Si une allocation choue,
la fonction renvoie NULL.
Pointeur sur le premier maillon dune liste.
Ladresse dune fonction appliquer chaque maillon de la
liste pour crr une nouvelle liste.
La nouvelle liste.
malloc(3)

Si vous russissez parfaitement la partie obligatoire et la partie bonus, vous tes


encourags ajouter dautres fonctions qui vous paraissent utiles pour agrandir votre
bibliothque. Si votre correcteur les juge pertinentes, vous pourriez avoir des points supplmentaires. Exemples : une version de ft_strsplit qui renvoie une liste de chaines au
lieu dun tableau de chaines, la fonction ft_lstfold similaire la fonction reduce de
Python et la fonction List.fold_left dOCaml (attention aux fuites mmoires !), des
fonctions de manipulation de tableaux, de piles, de files, de maps, de tables de hash, etc.
La limite est votre imagination.

13

Projet du module Algorithmie I

II.3

libft

Rendu

Vous devez rendre, la racine de votre dpt de rendu, un fichier auteur contenant
votre login suivi dun \n :
$>cat -e auteur
xlogin$

Vous devez rendre un fichier C par fonction raliser ainsi quun fichier libft.h
qui contiendra tous leurs prototypes ainsi que les macros et les typedefs dont
vous pourriez avoir besoin. Tous ces fichiers devront se trouver la racine de votre
dpot.
Vous devez rendre un Makefile qui compilera vos sources vers une bibliothque
statique nomme libft.a.
Votre Makefile doit au moins proposer les rgles $(NAME), all, clean, fclean et
re dans lordre qui vous paratra le plus adapt.
Votre Makefile doit compiler votre travail avec les flags de compilation -Wall,
-Wextra et -Werror.
Afin de faciliter votre soutenance, vous devez galement raliser un ou des programmes de test pour votre bibliothque. Bien que ce travail ne soit pas rendre
sur votre dpot et ne sera pas valu, il vous permettra de tester facilement
votre travail et celui des personnes dont vous ferez passer les soutenances. Vous
tes libres dutiliser vos tests ou ceux du souteneur/soutenu voire mme les deux
si cela vous fait plaisir et la logistique sous-jacente est votre discrtion. Il ny a
rien de pire que de ne pas avoir tous les points que vous mritez en soutenance
parceque le correcteur na pas eu le temps de tout valuer dans le temps imparti,
non ? Cest votre travail, votre responsabilite.
Seul le contenu prsent sur votre dpot sera valu en soutenance.

14

Projet du module Algorithmie I

II.4

libft

Considrations techniques

Votre fichier libft.h peut contenir des macros et des typedefs selon vos besoins.
Une chaine de caractres est TOUJOURS termine par un \0, mme si cela
a t omis dans la description dune fonction. Dans le cas contraire, cela serait
explicitement indiqu.
Interdiction dutiliser des variables globales.
Si vous avez besoin de fonctions auxiliaires pour lcriture dune fonction complexe,
vous devez dfinir ces fonctions auxiliaires en static dans le respect de la Norme.

Savoir ce quest une fonction statique est un bon dbut : http:


//codingfreak.blogspot.com/2010/06/static-functions-in-c.html

Vous devez prter attention vos types et utiliser judicieusement les casts quand
cest ncssaire, en particulier lorsquun type void * est impliqu. Dans labsolu,
vitez les casts implicites, quels que soient les types concerns. Exemple :
char

*str;

str = malloc(42 * sizeof(*str));


str = (char *) malloc(42 * sizeof(*str));

/* Wrong ! Malloc retourne un void * (cast implicite) */


/* Right ! (cast explicite) */

15

Projet du module Algorithmie I

II.5

libft

Fonctions autorises

malloc(3)
free(3)
write(2)
Vous devez bien entendu inclure linclude systme ncessaire pour utiliser lune ou
lautre des 3 fonctions autorises dans votre fichier .c concern. Le seul include systme
que vous tes autoriss utiliser en plus est string.h pour avoir accs la constante
NULL et au type size_t. Tout le reste est interdit.

16

Chapitre III
Consignes
Vous pouvez coder les fonctions dans lordre que vous voulez et ne pas russir
une fonction nempche pas davoir les points pour les suivantes si celles-ci sont
bonnes.
Vous tes vivement encourags faire appel des fonctions que vous avez dja
crites pour crire les suivantes.
Votre projet doit tre la Norme. La Norminette sera utilise pour vrifier la
Norme qui sapplique donc dans son ensemble. Une faute de norme donne la note
de 0 en soutenance.
En aucun cas vos fonctions ne doivent quitter de faon inattendue (Segmentation
fault, bus error, double free, etc) en dehors des comportements indtermins. Votre
projet serait alors considr comme non fonctionnel et recevra la note de 0 en
soutenance.
Toute mmoire alloue sur le tas doit tre libre proprement quand ncssaire.
On vous la dj dit, mais on le redit : vous devez rendre, la racine de votre
dpt de rendu, un fichier auteur contenant votre login suivi dun \n :
$>cat -e auteur
xlogin$

Vous ne devez jamais rendre de code que vous navez pas crit vous-mme. En cas
de doute, vous serez invits une sance de recode au bocal pour juger de votre
bonne foi.

17

Chapitre IV
Notation
Le projet libft seffectue sur le temps que vous jugez ncessaire pour le raliser
compltement. Un dlai raisonnable est une semaine. Attention ne pas prendre trop
de temps, faute de quoi votre scolarit risque dtre beaucoup plus longue que les trois
annes prvues, et de ne pas le faire trop vite -risque de bug en pagaille- ou moiti,
vous pourriez ne pas valider le projet et ne pas obtenir les comptences associes.

Ensuite, vous aurez une soutenance peer-correcting classique la fin du projet pour
obtenir votre note. Lors de cette soutenance, vos bonus ne seront pris en compte que si
vous obtenez au moins 18/20 la partie obligatoire.
La partie obligatoire est sur 20 points et la partie bonus sur 22 points pour un total
de 42 points maximum.

Bon courage tous !

18