A l'origine, il y avait register_printf_function qui était (et est toujours) parfaitement documenté sur le site officiel de la glibc: http://www.gnu.org/software/libc/manual/html_node/Customizing-Printf.html
Mais un warning deprecated apparait lorsqu'on utilise cette fonction. La doc du site officiel ne le dit absolument pas (si il est à jour. Dernière mise à jour August 14, 2015, for glibc 2.22).
Ils ont donc créé une nouvelle API pour étendre l'affichage de printf: register_printf_specifier, register_printf_type, register_printf_modifier. Mais elle est documentée nulle part !
Donc l'ancienne API est obsolète mais documentée, et la nouvelle non documentée. Magnifique !
Tout ce qu'on trouve est un exemple d'utilisation: https://sourceware.org/bugzilla/attachment.cgi?id=3874&action=view
Bon, l'exemple est suffisamment détaillé pour savoir s'en servir (dans le cas basique)...
Mais :
static int toto_printf_f (FILE *fp, const struct printf_info *info, const void *const *args)
{
const toto_struct * const * const * const *toto_arg = (const toto_struct * const * const * const *) args;
toto_out(fp, ***toto_arg);
}
Regarder moi ce niveau d'indirection ! Non, je ne me suis pas trompé. C'est bien le bon niveau pour afficher ce que je veux !
