Connexion
Vous n'avez pas encore de compte personnel ? Vous devriez en créer un. Une fois enregistré vous aurez certains avantages, comme pouvoir modifier l'aspect du site, ou poster des commentaires signés...
Support
Activité du Site

Pages vues depuis 06/01/2019 : 13 379 018

  • Nb. de membres 368
  • Nb. d'articles 2 854
  • Nb. de forums 24
  • Nb. de sujets 13
  • Nb. de critiques 0

Top 10  Statistiques

Index du forum »»  Développement »» asprintf function.

asprintf function.#1102

3Contributeur(s)
AmiDARKTchekoFab
2 Modérateur(s)
PapiosaurBeWorld
AmiDARK AmiDARKicon_post
Salut,

J'ai vu que MORPHOS ne gérait pas l'asprintf (ni vasprintf) ou je n'ai pas inclut le bon fichier.

Un peu d'aide SVP ?

@+
AmiDARK
Tcheko Tchekoicon_post
Je vote pour l'!include!.

Toutefois, écrire un équivalent de asprintf avec sprintf n'est pas difficile non plus...

Après, il faut aussi savoir comment libérer la ressource allouée par asprintf... FreeVec()? FreeMem()? FreeVecTaskPooled()? FreeMemPool()? free()?

Bref...

SInon, pour formater les strings il y a NewRawDoFmt sur MorphOS. Avec un paramètre spécial : RAWFMT_COUNT ou un truc dans le genre qui calcule la taille de la chaîne de caractère... .

Voili voila.++
AmiDARK AmiDARKicon_post
Ben en fait, j'ai vu sur le net que AROS & MorphOS n'avaient pas asprintf ...
Mais si il y a juste un "!!include!!" Ã ajouter je suis preneur :)
Cependant, sur AmigaOS4, sans modifier les !!include!!s, asprintf est géré ... Bizarre ...

Bon j'ai remis en français :p J'ai du me croire sur un forum anglais quand j'ai écrit le message initial :p MDR
La fatigue ça ;)

@+
AmiDARK
Tcheko Tchekoicon_post
ecrire un wrapper asprintf ne doit pas être bien compliqué. Normalement, la famille des *printf retourne le nombre de caractères de la chaîne formatée et doit pouvoir prendre NULL comme argument pour le tampon d'écriture.

Ca doit ressembler à un truc dans le genre:

STRPTR asprintf(char *format, char *buffer, ...)
{
va_start;
int len = sprintf(format, NULL, va_args);

STRPTR buffer = AllocVec(len, MEMF_ANY);
if(buffer)
{
sprintf(format, buffer, va_args);
}
va_end;
return buffer;
}

les va_*,c 'est au pif d'après mes vagues souvenirs.

++
Fab Fabicon_post
Les fonctions nullix allouent avec malloc, il ne vaut mieux pas s'en écarter sous peine de trash mem (malloc utilise des pools, donc FreeVec dessus ça ferait mal).

Donc au vu du prototype, ça donnerait ça, avec quelques petites corrections ici et là :

STRPTR asprintf(char **strp, const char *format, ...)
{
va_list va_args;
int_t len;
char *buffer;

va_start(va_args, format);
len = sprintf(NULL, format, va_args);

buffer = (char *) malloc(len);
if(buffer)
{
sprintf(buffer, format, va_args);
}
va_end(vl);
*strp = buffer;
return buffer;
}

Et à libérer avec free, donc.
AmiDARK AmiDARKicon_post
Merci pour vos réponses :)