void buffer_sprintf(BUFFER *wb, const char *fmt, ...) { if(unlikely(!fmt || !*fmt)) return; buffer_need_bytes(wb, 1); size_t len = wb->size - wb->len, wrote; va_list args; va_start(args, fmt); wrote = (size_t) vsnprintf(&wb->buffer[wb->len], len, fmt, args); va_end(args); if(unlikely(wrote >= len)) { // there is bug in vsnprintf() and it returns // a number higher to len, but it does not // overflow the buffer. // our buffer overflow detector will log it // if it does. buffer_overflow_check(wb); debug(D_WEB_BUFFER, "web_buffer_sprintf(): increasing web_buffer at position %ld, size = %ld\n", wb->len, wb->size); buffer_need_bytes(wb, len + WEB_DATA_LENGTH_INCREASE_STEP); va_start(args, fmt); buffer_vsprintf(wb, fmt, args); va_end(args); } else wb->len += wrote; // the buffer is \0 terminated by vsnprintf }
void buffer_sprintf(BUFFER *wb, const char *fmt, ...) { if(unlikely(!fmt || !*fmt)) return; buffer_need_bytes(wb, 2); size_t len = wb->size - wb->len - 1; size_t wrote; va_list args; va_start(args, fmt); wrote = (size_t) vsnprintfz(&wb->buffer[wb->len], len, fmt, args); va_end(args); if(unlikely(wrote >= len)) { // truncated buffer_overflow_check(wb); debug(D_WEB_BUFFER, "web_buffer_sprintf(): increasing web_buffer at position %zu, size = %zu\n", wb->len, wb->size); buffer_need_bytes(wb, len + WEB_DATA_LENGTH_INCREASE_STEP); va_start(args, fmt); buffer_vsprintf(wb, fmt, args); va_end(args); } else wb->len += wrote; // the buffer is \0 terminated by vsnprintf }
test_vsprintf(struct buffer *buffer, const char *format, ...) { va_list args; va_start(args, format); buffer_vsprintf(buffer, format, args); va_end(args); }