Je ne sais pas pourquoi ta fonction ressoit trois fois la même valeur. Elle devrait recevoir trois fois une valeur différente. Mais ce que tu fait n'est pas correcte quand même, car je suis presque certain que l'ordre d'évaluation des arguments n'est pas spécifié en C. Donc tu ne sais pas lequel des va_arg est exécuté en premier, etc. Ce qui fait que les trois arguments peuvent être lu dans n'importe quelle ordre (celà, dit, je suspecte un bgu d'optimisation du compilo qui fait que c'est trois fois la même valeur qui est lue). Prends trois variables temporaire, charge dans le bon ordre les arguments de ta fonction, puis passe les à ta sous-fonction.
Cela dit, dreamslayers a raison, ce n'est pas un bon cas d'utilisation des fonctions a nombre variable d'argument si tu reçoit un très grand nombre d'argument qui ont toujours le même sens (chacun d'eux, d'appel en appel). Usuellement les fonctions à nombre variable d'arguments reçoivent soit pleins d'arguments tous du même type mais on ne sais pas combien à l'avance (avec un premier argument qui est un int) ou alors des arguments dont le type peut varier à chaque appel (dans le genre de ce que fait printf). Là, tu devrais plutôt avoir des fonctions différentes qui sont appelées selon la valeur de "mode" (et donc mode n'est pas passé à la fonction).