int printf_handler(const char *format, va_list args)
{
...
sv_vsetpvf(printf_str, format, &args);
...
####
int printf_handler(const char *format, va_list* args)
{
...
sv_vsetpvf(printf_str, format, args);
...
####
#include
#include
#include
void vatest__(char* format, va_list* args) {
// this kind of represents sv_vsetpvf()
char buf[1024];
vsprintf(buf, format, *args);
errno = 0; // "Success"
perror(buf);
}
void vatest_(char* format, va_list args) {
// this represents your printf_handler()
vatest__(format, &args);
}
void vatest(char* format, ...) {
va_list args;
va_start (args, format);
vatest_(format, args);
va_end (args);
}
int main (int argc, char *argv[]) {
char* msg1 = "foo";
char* msg2 = "bar";
vatest("%s: %s", argv[0], msg1); // two args
vatest("%s: %s,%s", argv[0], msg1, msg2); // three args
return 0;
}
####
$ gcc -Wall vatest.c -o vatest
vatest.c: In function `vatest_':
vatest.c:17: warning: passing arg 2 of `vatest__' from incompatible pointer type
$ ./vatest
Segmentation fault
$ file vatest
vatest: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.6.4, dynamically linked (uses shared libs), for GNU/Linux 2.6.4, not stripped
####
...
void vatest_(char* format, va_list* args) {
vatest__(format, args);
}
void vatest(char* format, ...) {
va_list args;
va_start (args, format);
vatest_(format, &args);
va_end (args);
}
...
####
$ gcc -Wall vatest.c -o vatest
$ ./vatest
./vatest: foo: Success
./vatest: foo,bar: Success