libft/README.md

300 lines
8.1 KiB
Markdown

# Libft - École 42
## Description
Libft est le premier projet de l'École 42 et constitue une bibliothèque C personnelle qui regroupe des fonctions essentielles. Cette bibliothèque sera utilisée tout au long du cursus 42 et permet de maîtriser les bases de la programmation en C.
## Objectifs pédagogiques
- Maîtriser les **bases de la programmation** en C
- Comprendre la **gestion mémoire** (malloc/free)
- Implémenter des **algorithmes fondamentaux**
- Respecter la **norme de codage** 42
- Créer une **bibliothèque réutilisable** pour les projets futurs
## Fonctions implémentées
### Partie 1 - Fonctions de la libc
#### Manipulation de caractères
- `ft_isalpha` - Teste si un caractère est alphabétique
- `ft_isdigit` - Teste si un caractère est un chiffre
- `ft_isalnum` - Teste si un caractère est alphanumérique
- `ft_isascii` - Teste si un caractère est ASCII
- `ft_isprint` - Teste si un caractère est imprimable
- `ft_tolower` - Convertit en minuscule
- `ft_toupper` - Convertit en majuscule
#### Manipulation de chaînes
- `ft_strlen` - Calcule la longueur d'une chaîne
- `ft_strchr` - Trouve la première occurrence d'un caractère
- `ft_strrchr` - Trouve la dernière occurrence d'un caractère
- `ft_strncmp` - Compare deux chaînes sur n caractères
- `ft_strnstr` - Trouve une sous-chaîne dans une chaîne
- `ft_strlcpy` - Copie une chaîne de manière sécurisée
- `ft_strlcat` - Concatène des chaînes de manière sécurisée
#### Manipulation de mémoire
- `ft_memset` - Remplit une zone mémoire avec un octet
- `ft_bzero` - Met à zéro une zone mémoire
- `ft_memcpy` - Copie une zone mémoire
- `ft_memmove` - Copie une zone mémoire (gère les chevauchements)
- `ft_memchr` - Trouve un octet dans une zone mémoire
- `ft_memcmp` - Compare deux zones mémoire
#### Conversion et allocation
- `ft_atoi` - Convertit une chaîne en entier
- `ft_calloc` - Alloue et initialise une zone mémoire
- `ft_strdup` - Duplique une chaîne (avec allocation)
### Partie 2 - Fonctions supplémentaires
#### Manipulation de chaînes avancée
- `ft_substr` - Extrait une sous-chaîne
- `ft_strjoin` - Joint deux chaînes
- `ft_strtrim` - Supprime les caractères en début/fin
- `ft_split` - Divise une chaîne selon un délimiteur
- `ft_itoa` - Convertit un entier en chaîne
- `ft_strmapi` - Applique une fonction à chaque caractère
- `ft_striteri` - Applique une fonction à chaque caractère (avec index)
#### Fonctions d'écriture
- `ft_putchar_fd` - Écrit un caractère sur un fd
- `ft_putstr_fd` - Écrit une chaîne sur un fd
- `ft_putendl_fd` - Écrit une chaîne + '\n' sur un fd
- `ft_putnbr_fd` - Écrit un nombre sur un fd
### Bonus - Listes chaînées
#### Structure
```c
typedef struct s_list
{
void *content;
struct s_list *next;
} t_list;
```
#### Fonctions de manipulation
- `ft_lstnew` - Crée un nouvel élément
- `ft_lstadd_front` - Ajoute un élément au début
- `ft_lstsize` - Compte les éléments
- `ft_lstlast` - Retourne le dernier élément
- `ft_lstadd_back` - Ajoute un élément à la fin
- `ft_lstdelone` - Supprime un élément
- `ft_lstclear` - Supprime et libère toute la liste
- `ft_lstiter` - Applique une fonction à chaque élément
- `ft_lstmap` - Applique une fonction et crée une nouvelle liste
## Installation et utilisation
### Compilation
```bash
git clone <repository-url>
cd libft
make
```
### Utilisation dans un projet
```c
#include "libft.h"
int main(void)
{
char *str = ft_strdup("Hello, World!");
char **split = ft_split(str, ' ');
// Utilisation des fonctions...
free(str);
// Libérer split...
return (0);
}
```
### Compilation avec la libft
```bash
gcc -Wall -Wextra -Werror -L. -lft main.c
```
## Structure du projet
```
libft/
├── Makefile # Compilation et règles
├── libft.h # Header avec prototypes
├── ft_*.c # Fonctions principales
├── ft_lst*.c # Fonctions bonus (listes)
└── README.md # Documentation
```
## Makefile
### Règles disponibles
- `make` / `make all` - Compile la bibliothèque libft.a
- `make bonus` - Compile avec les fonctions bonus
- `make clean` - Supprime les fichiers .o
- `make fclean` - Supprime tout + libft.a
- `make re` - Recompile entièrement
### Flags de compilation
```makefile
CC = gcc
CFLAGS = -Wall -Wextra -Werror
```
## Tests et validation
### Tests recommandés
```bash
# Test basique
make && echo "Compilation OK"
# Test avec main personnalisé
gcc -Wall -Wextra -Werror -L. -lft test_main.c
# Vérification mémoire
valgrind ./a.out
```
### Outils de test tiers
- **libft-unit-test** - Tests automatisés
- **42TESTERS-LIBFT** - Batterie de tests complète
- **libftTester** - Tests avec comparaison libc
## Exemples d'utilisation
### Manipulation de chaînes
```c
#include "libft.h"
int main(void)
{
char *str = " Hello, World! ";
char *trimmed = ft_strtrim(str, " ");
char **words = ft_split(trimmed, ',');
printf("Original: '%s'\n", str);
printf("Trimmed: '%s'\n", trimmed);
printf("First word: '%s'\n", words[0]);
free(trimmed);
// Libérer words...
return (0);
}
```
### Listes chaînées
```c
#include "libft.h"
int main(void)
{
t_list *lst = NULL;
ft_lstadd_back(&lst, ft_lstnew(ft_strdup("First")));
ft_lstadd_back(&lst, ft_lstnew(ft_strdup("Second")));
ft_lstadd_back(&lst, ft_lstnew(ft_strdup("Third")));
printf("List size: %d\n", ft_lstsize(lst));
ft_lstclear(&lst, free);
return (0);
}
```
### Conversion et validation
```c
#include "libft.h"
int main(void)
{
char *input = "42";
if (ft_isdigit(*input))
{
int num = ft_atoi(input);
char *str_num = ft_itoa(num * 2);
printf("Double: %s\n", str_num);
free(str_num);
}
return (0);
}
```
## Algorithmes et complexités
### Complexités temporelles
| Fonction | Complexité | Description |
|----------|------------|-------------|
| ft_strlen | O(n) | Parcours linéaire |
| ft_strchr | O(n) | Recherche linéaire |
| ft_memcpy | O(n) | Copie octet par octet |
| ft_split | O(n) | Avec allocation multiple |
| ft_lstsize | O(n) | Parcours de liste |
### Optimisations implémentées
- **Protection contre NULL** dans toutes les fonctions
- **Gestion des cas limites** (chaînes vides, etc.)
- **Efficacité mémoire** avec malloc minimal
- **Réutilisation** de fonctions entre elles
## Gestion mémoire
### Stratégies appliquées
- **Vérification systématique** des retours malloc
- **Libération en cas d'échec** partiel
- **Protection contre les double-free**
- **Tests Valgrind** pour validation
### Fonctions d'allocation
```c
// Allocation sécurisée avec vérification
void *ft_calloc(size_t count, size_t size);
// Duplication avec gestion d'erreur
char *ft_strdup(const char *s1);
// Extraction avec allocation
char *ft_substr(char const *s, unsigned int start, size_t len);
```
## Normes et contraintes 42
### Norme de codage respectée
- **25 lignes maximum** par fonction
- **5 fonctions maximum** par fichier
- **Noms de variables** explicites
- **Pas de variables globales**
- **Gestion d'erreurs** obligatoire
### Fonctions interdites
- Aucune fonction de la libc autorisée
- Implémentation from scratch obligatoire
- Tests de conformité avec comportement original
## Extensions possibles
### Fonctions additionnelles utiles
- `ft_realloc` - Réallocation mémoire
- `ft_strstr` - Recherche de sous-chaîne
- `ft_strcmp` - Comparaison complète
- `ft_strcat` - Concaténation simple
- `ft_isspace` - Test caractères blancs
### Structures de données avancées
- **Tableaux dynamiques** (vector-like)
- **Tables de hachage** basiques
- **Arbres binaires** simples
## Compétences développées
- **Programmation C** fondamentale
- **Gestion mémoire** rigoureuse
- **Algorithmes** de base (recherche, tri)
- **Structures de données** (listes chaînées)
- **Debugging** et tests unitaires
- **Conception de bibliothèques** réutilisables
- **Optimisation** de code
## Auteur
Alexandre Pommier (apommier) - École 42
## Licence
Projet académique - École 42