/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* ft_printf.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: lkantzer <lkantzer@student.42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/11/26 17:28:45 by lkantzer #+# #+# */ /* Updated: 2024/12/05 14:39:40 by lkantzer ### ########.fr */ /* */ /* ************************************************************************** */
ft_printf & get_next_line
Reconstruire les briques de la libc
Une réimplémentation de printf et une lecture ligne à ligne à état persistant, réutilisées dans presque tous les projets C suivants.
- 6
- conversions
- 4 projets
- réutilisé dans
- 0
- fuites
ft_printf
Une fonction à nombre d'arguments variable ne sait ni combien on lui en passe, ni de quel type : c'est la chaîne de format qui le lui dit, et elle doit la croire sur parole.
- %c · %s
- Un caractère, une chaîne.
- %p
- Une adresse, en hexadécimal préfixé de 0x.
- %d · %i
- Un entier signé.
- %u
- Un entier non signé.
- %x · %X
- Un entier non signé en hexadécimal, minuscules ou majuscules.
- %%
- Un pour cent littéral.
Chaque conversion vit dans son fichier et rend le nombre de caractères écrits ; l'analyseur de format ne fait que les appeler et additionner — c'est ce total que printf est censé retourner.
get_next_line
Lire un fichier ligne par ligne alors que read ne connaît que des blocs de taille fixe : entre deux appels, il reste presque toujours quelque chose qu'on a lu en trop.
- 01Le tampon
read remplit un bloc de BUFFER_SIZE octets, qui ne tombe presque jamais pile sur un saut de ligne.
- 02Le résidu
Ce qui suit le saut de ligne est gardé dans une variable statique : ce sera le début de la ligne suivante.
- 03L'appel suivant
Il commence par regarder ce résidu — s'il contient déjà un saut de ligne, aucune lecture n'est nécessaire.
- 04La fin
Quand read rend zéro, on rend ce qui reste, puis NULL, et on libère le résidu — sans jamais rendre une ligne deux fois.
Ces deux modules ne sont pas restés dans leur dépôt : on les retrouve embarqués dans minitalk, fract-ol et push_swap. Les écrire correctement une fois évite de les redéboguer trois fois.
- 01Une conversion par fichier, orchestrées par un analyseur de format
- 02get_next_line conserve entre deux appels ce qui a été lu en trop
- 03Réutilisées telles quelles dans minitalk, fract-ol et push_swap
Le tampon résiduel
Toute la subtilité tient dans ce qui reste après le saut de ligne : le garder, le rendre au prochain appel, le libérer en fin de fichier sans rien perdre.