C'est bizarre. En fait je pense que ce n'est pas possible de recoder sprintf de manière portable.
Si, c'est tout à fait possible.
En fait, le seul vrai problème avec les fonctions de la famille printf, ce sont les nombres flottants car je ne pense pas qu'il existe de solution portable pour les afficher avec une précision suffisante (ou, si c'est le cas, je veux bien qu'on me la présente ).
Sinon, la solution de la conversion en FILE est juste barbare.
Même à supposer que le premier champ de la structure soit un tableau de char (ce qui n'est pas le cas de la glibc), cela ne garantit en rien du succès de l'opération.
Effectivement c'est une bonne idée. Mais vu comment je m'y suis pris dans mon implémentation ce n'est pas envisageable. Tant pis je me passerai de ces deux fonctions.
@Taurre : paraze a testé pour moi sous ArchLinux, ma fonction my_sprintf a très bien marché. On est d'accord ça relève de l'obfuscation, mais je ne pense pas que l'implémentation de FILE varie entre distributions GNU / Linux si ?
En fait, le seul vrai problème avec les fonctions de la famille printf, ce sont les nombres flottants car je ne pense pas qu'il existe de solution portable pour les afficher avec une précision suffisante (ou, si c'est le cas, je veux bien qu'on me la présente ).
Je pense que c'est faisable, mais en écrivant plus de code que si l'on écrivait une version pour chaque architecture, donc forcément... En revanche on peut obtenir des résultats très satisfaisant (pas parfait certes... ) grâce à des implémentations portables (cf. nos 2 implémentations si je me souviens bien... ) !
Comment alors ? Puisque les champs de FILE diffèrent selon l'implémentation.
Ben, en ce qui me concerne, j'aurais pensé à une fonction supplémentaire qui chapeauterait vfprintf et vsprintf avec un prototype de ce type :
int vfsprintf(char const *fmt, va_list ap, int type, void *dst);
Dont l'argument type indique si elle doit travailler sur une structure FILE ou sur une chaîne de caractères. Cela allourdi la fonction car cela implique des conditions supplémentaires, mais au moins on évite de dupliquer du code. Aussi, vfprintf et vsprintf peuvent alors être implantées sous forme de macrofonctions :
Sinon, il ne faut pas perdre de vue que si l'on implante la lib C, on doit définir la structure FILE.
Citation : informaticienzero
@Taurre : paraze a testé pour moi sous ArchLinux, ma fonction my_sprintf a très bien marché. On est d'accord ça relève de l'obfuscation, mais je ne pense pas que l'implémentation de FILE varie entre distributions GNU / Linux si ?
J'aurais dit que cela relève du suicide.
Mais, sinon, je n'ai pas d'explication à ce stade... Peut-être que l'implantation a changé depuis la version 2.13 (version installée sous Debian squeeze). M'enfin, de toute manière, écrire directement dans le tampon d'une structure FILE engendre un comportement indéterminé, c'est donc à proscrire (la norme ne précise pas ce qu'il se passe dans un tel cas).
EDIT:
Citation : Holt
Je pense que c'est faisable, mais en écrivant plus de code que si l'on écrivait une version pour chaque architecture, donc forcément... En revanche on peut obtenir des résultats très satisfaisant (pas parfait certes... ) grâce à des implémentations portables (cf. nos 2 implémentations si je me souviens bien... ) !
Si je me rappel bien, il me semble que nos implantations manquaient de précision (notamment pour les grands nombres) comparé aux autres. Maintenant, je pense également qu'une solution portable est envisageable, mais elle sera probablement affreusement lourde (mais je serais quand même curieux d'en voir une ).
Sinon, il ne faut pas perdre de vue que si l'on implante la lib C, on doit définir la structure FILE.
C'est vrai, mais comme mon projet actuel est juste de recoder printf et sa famille et non tout stdio.h, j'ai la flemme.
Mais ton idée de macro est très intéressante, je garde ça sous le coude.
M'enfin, de toute manière, écrire directement dans le tampon d'une structure FILE engendre un comportement indéterminé, c'est donc à proscrire (la norme ne précise pas ce qu'il se passe dans un tel cas).
Je me rends compte que ma remarque est complètement à l'ouest puisque tu n'écris pas directement dans le tampon d'un flux.
En fait, je voulais dire qu'exploiter un tableau de char comme une structure FILE est... Heu... de la folie (en fait, je ne comprends même pas pourquoi cela fonctionne dans certains cas).
Je me rends compte que ma remarque est complètement à l'ouest puisque tu n'écris pas directement dans le tampon d'un flux.
En fait, je voulais dire qu'exploiter un tableau de char comme une structure FILE est... Heu... de la folie (en fait, je ne comprends même pas pourquoi cela fonctionne dans certains cas).
C'est le principe d'un comportement indéterminé : faire l'inverse de ce qu'on pense qu'il va faire. ^^"