static void append_to_buffer_valist(char **buff, size_t *buff_size, size_t *offset, const char *fmt, va_list args) { belle_sip_error_code ret; size_t prevoffset = *offset; #ifndef _WIN32 va_list cap;/*copy of our argument list: a va_list cannot be re-used (SIGSEGV on linux 64 bits)*/ va_copy(cap,args); ret = belle_sip_snprintf_valist(*buff, *buff_size, offset, fmt, cap); va_end(cap); #else ret = belle_sip_snprintf_valist(*buff, *buff_size, offset, fmt, args); #endif /*if we are out of memory, we add some size to buffer*/ if (ret == BELLE_SIP_BUFFER_OVERFLOW) { /*some compilers complain that size_t cannot be formatted as unsigned long, hence forcing cast*/ ms_warning("QualityReporting: Buffer was too small to contain the whole report - increasing its size from %lu to %lu", (unsigned long)*buff_size, (unsigned long)*buff_size + 2048); *buff_size += 2048; *buff = (char *) ms_realloc(*buff, *buff_size); *offset = prevoffset; /*recall itself since we did not write all things into the buffer but only a part of it*/ append_to_buffer_valist(buff, buff_size, offset, fmt, args); } }
belle_sip_error_code belle_sip_snprintf(char *buff, size_t buff_size, size_t *offset, const char *fmt, ...) { belle_sip_error_code ret; va_list args; va_start(args, fmt); ret = belle_sip_snprintf_valist(buff, buff_size, offset, fmt, args); va_end(args); return ret; }