Systèmes2024Terminé
/* ************************************************************************** */
/*                                                                            */
/*                                                        :::      ::::::::   */
/*   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       */
/*                                                                            */
/* ************************************************************************** */
Created : ouverture du dépôt · Updated : dernier commit

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.

CArguments variadiquesLecture bufferiséeMakefile
6
conversions
4 projets
réutilisé dans
0
fuites
Comment ça marche

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.

  1. 01Le tampon

    read remplit un bloc de BUFFER_SIZE octets, qui ne tombe presque jamais pile sur un saut de ligne.

  2. 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.

  3. 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.

  4. 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.

Les fondations réutiliséesdémo interactive
ft_printf6 conversionsget_next_linetampon résiduelminitalkfract-olpush_swap

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.

En bref
  • 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 point dur

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.