1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
| va_list argList;
char * parameters = NULL;
if ((gRDSFlag == 1) && (theEvent <= RDS_FormerMaxEvNum))
{
/*Routine to save info about RDS event in the circular buffer for Post Mortem file*/
va_start(argList,theFormat);
parameters = ParametersChain(theFormat,argList);
va_end(argList);
if (parameters) {
SaveRdsEvPostMortem(theEvent, theClass, theSubcode, theFormat, parameters);
free(parameters), parameters = NULL;
}
}
[...]
char* ParametersChain(char const * theFormat, va_list argList)
{
char* parameters = NULL;
char* nextParameter = NULL;
parameters = malloc(512+1);
if(!parameter) { return NULL; }
nextParameter= malloc(512+1);
if(!nextParameter) {
free(parameters), parameters = NULL;
return NULL;
}
/*To get parameters from the format variable*/
if(!theFormat){
strcpy(parameters,"None");
}
else{
#ifdef METHODE1
/*méthode1: utiliser vsprintf et se passer de la boucle while*/
vsprintf(parameters,theFormat,argList);
printf("vsprintf chaine: %s\n", parameters);
#else
/* Get and add each param except the last one to the event */
/*méthode2: récupérer sous forme de chaine chaque variable et concaténer*/
while (*theFormat != '\0') {
/* Et avec QUOI de theFormat comptes-tu récupérer un argument de type char* ? */
printf("chaine: %s\n", va_arg(argList, char*)); /*Ne marche pas*/
/* Et avec QUOI de theFormat comptes-tu récupérer un argument de type int ? */
sprintf(nextParameter, "%x", va_arg(argList, int));
/* Prendre une chaine d'un tampon pour réécrire ensuite dans le même tampon, curieux..., et superbe comportement indéfini */
sprintf(parameters,"%s%s%s%s",parameters,"0x",nextParameter," ");
printf("parameters = %s, %d \n",parameters,va_arg (argList, int));
#endif
/* advance to the next format character */
theFormat++;
/* As-tu compris que ce code essaie de récupérer pour CHAQUE (et quelquesoit celui-ci) caractère du format
une chaine, un entier, puis encore un entier, d'autant plus que tu ne fais qu'afficher
la chaine sur la sortie standard, sans la stocker, pareil pour le deuxième entier.
Ca n'a rien à voir avec le vsprintf() au niveau comportemental et cela implique que si tu as 3 caractères
('\0' non compris), tu as en tout à passer 9 arguments après le format à la fonction !!.
*/
}
printf("parameters chain = %s\n\n", parameters);
} /* has param */
free(nextParameter), nextParameter = NULL;
return parameters;
} |