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 }
int snprintfz(char *dst, size_t n, const char *fmt, ...) { va_list args; va_start(args, fmt); int ret = vsnprintfz(dst, n, fmt, args); va_end(args); return ret; }
int snprintfz(char *buf, int size, const char *fmt,...) { va_list ap; va_start(ap, fmt); int len = vsnprintfz(buf, size, fmt, ap); va_end(ap); return len; }
void buffer_vsprintf(BUFFER *wb, const char *fmt, va_list args) { if(unlikely(!fmt || !*fmt)) return; buffer_need_bytes(wb, 2); size_t len = wb->size - wb->len - 1; wb->len += vsnprintfz(&wb->buffer[wb->len], len, fmt, args); buffer_overflow_check(wb); // the buffer is \0 terminated by vsnprintfz }
void buffer_snprintf(BUFFER *wb, size_t len, const char *fmt, ...) { if(unlikely(!fmt || !*fmt)) return; buffer_need_bytes(wb, len + 1); va_list args; va_start(args, fmt); wb->len += vsnprintfz(&wb->buffer[wb->len], len, fmt, args); va_end(args); buffer_overflow_check(wb); // the buffer is \0 terminated by vsnprintfz }