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
| /* On ne doit pas affecter directement
le retour de realloc() au pointeur original :
Sinon, en cas d'échec, on le perd.*/
/* Retourne 0 si OK, -1 si échec
(comme les fonctions standard/POSIX) */
int MyReallocChar(char **ppC, int nTaille) {
char *pTmpC = realloc(*ppC, nTaille);
if(pTmpC != NULL) {
*ppC = pTmpC;
}
return ((pTmpC != NULL) ? 0 : -1);
}
char *concat(int nb, ...) {
va_list vl;
int i;
/* ou NULL, mais toujours un pointeur du même type:
ici, un pointeur libérable avec free(). */
char *pRes = strdup("");
char const *pcTmp = NULL;
va_start(vl, nb);
for (i = 0; i < nb; i++) {
pcTmp = va_arg(vl, char const*);
if(MyRealloc(&pRes, strlen(pcTmp) + strlen(pRes) + 1)) {
return pRes; /* N'a pas pu agrandir : stop (ou erreur) */
}
strcat(pRes, pcTmp);
}
va_end(vl);
return pRes;
} |