Lire le format
La chaîne est parcourue caractère par caractère.
case 'd':
w_sd(ptr, res);
return 1;
case 's':
w_ptr_char(ptr, res);
return 1;
case 'x':
w_hexa(ptr, res);
return 1;
Une version réduite de printf écrite en C pour comprendre les arguments variadiques, le décodage d'un format et les conversions numériques.
printf reçoit une chaîne qui mélange du texte et des marqueurs comme
%d ou %s. TinyPrintf reproduit ce principe avec
un périmètre volontairement limité.
La fonction parcourt le format, récupère les arguments au fur et à mesure,
les écrit sur la sortie standard avec putchar(), puis renvoie
le nombre de caractères affichés. L'exercice impose ainsi de construire les
conversions sans appeler la fonction printf de la bibliothèque standard.
La chaîne est parcourue caractère par caractère.
Un caractère % déclenche l'analyse du caractère suivant.
va_list et va_arg donnent accès à la valeur attendue.
Les entiers sont décomposés récursivement en base 8, 10 ou 16.
Chaque caractère passe par putchar() et incrémente le résultat.
%d
Entier décimal signé
%u
Entier décimal non signé
%o
Écriture en base octale
%x
Écriture hexadécimale en minuscules
%s
Chaîne, avec (null) pour un pointeur nul
%c
Caractère ASCII
%%
Caractère pour cent littéral
Une directive inconnue n'est pas consommée : par exemple,
%q est recopié tel quel dans la sortie.
La cible make all compile le fichier objet avec les options
C99 strictes demandées. Le dépôt contient également 45 tests Criterion
portant sur la sortie produite et la valeur de retour.
Un banc de test indépendant confirme le texte ordinaire, les sept directives et le comptage sur des valeurs usuelles. La suite Criterion n'a pas pu être relancée localement car la bibliothèque n'est pas installée.
La copie conservée n'est pas entièrement conforme au sujet : elle contient
une fonction main alors qu'aucune n'était attendue, inclut
stdio.h hors de la liste autorisée et n'appelle pas
va_end. Les cas limites %d avec zéro ou
INT_MIN, ainsi que %o avec une grande valeur non
signée, produisent aussi une sortie incorrecte. La page décrit donc le rendu
présent sans revendiquer une compatibilité complète avec printf.
Le rendu met en place le parcours du format, la lecture d'arguments variadiques, sept directives et des conversions récursives pour les représentations décimale, octale et hexadécimale. Il compte les caractères au moment où ils sont écrits sur la sortie standard.
TinyPrintf m'a fait pratiquer les fonctions variadiques, la représentation des nombres dans plusieurs bases et le traitement précis d'une chaîne de format. L'audit des cas extrêmes rappelle aussi l'importance des bornes des types entiers et de tests qui dépassent les exemples nominaux.