#include #include #include #include #include #include "exit_if.h" #include "erreurs.h" #include "formater.h" #define TBLOC 256 /* Ces tailles devraient être calculées dynamiquement */ #define TAILLE_MAX_INT 32 #define TAILLE_MAX_DOUBLE 32 static void agrandir(int); static char *tampon; static int position; static int taille; char * formater(format_specif debut, ...) { va_list par; format_specif specification; char *resultat; va_start(par, debut); specification = debut; tampon = malloc(TBLOC); EXIT_IF(tampon == NULL, err_malloc); position = 0; taille = TBLOC; for (;;) { switch (specification) { case Char: { char c = va_arg(par, char); agrandir(sizeof(char)); position += sprintf(tampon+position, "%c", c); break; } case Int: { int i = va_arg(par, int); agrandir(TAILLE_MAX_INT); position += sprintf(tampon+position, "%d", i); break; } case Double: { double x = va_arg(par, double); agrandir(TAILLE_MAX_DOUBLE); position += sprintf(tampon+position, "%g", x); break; } case String: { char *s = va_arg(par, char *); agrandir(strlen(s)); position += sprintf(tampon+position, "%s", s); break; } case Eop : resultat = malloc(strlen(tampon) + 1); strcpy(resultat, tampon); free(tampon); return(resultat); } specification = va_arg(par, format_specif); } } static void agrandir(int extension) { if (position + extension >= taille) { while (position + extension >= taille) taille += TBLOC; tampon = realloc(tampon, taille); EXIT_IF(tampon == NULL, err_realloc); } }