APU_DECLARE(apr_status_t) apr_brigade_vprintf(apr_bucket_brigade *b, apr_brigade_flush flush, void *ctx, const char *fmt, va_list va) { /* the cast, in order of appearance */ struct brigade_vprintf_data_t vd; char buf[APR_BUCKET_BUFF_SIZE]; int written; vd.vbuff.curpos = buf; vd.vbuff.endpos = buf + APR_BUCKET_BUFF_SIZE; vd.b = b; vd.flusher = &flush; vd.ctx = ctx; vd.cbuff = buf; written = apr_vformatter(brigade_flush, &vd.vbuff, fmt, va); if (written == -1) { return -1; } /* write out what remains in the buffer */ return apr_brigade_write(b, flush, ctx, buf, vd.vbuff.curpos - buf); }
APR_DECLARE_NONSTD(int) apr_file_printf(apr_file_t *fptr, const char *format, ...) { struct apr_file_printf_data data; va_list ap; int count; /* don't really need a HUGE_STRING_LEN anymore */ data.buf = malloc(HUGE_STRING_LEN); if (data.buf == NULL) { return -1; } data.vbuff.curpos = data.buf; data.vbuff.endpos = data.buf + HUGE_STRING_LEN; data.fptr = fptr; va_start(ap, format); count = apr_vformatter(file_printf_flush, (apr_vformatter_buff_t *)&data, format, ap); /* apr_vformatter does not call flush for the last bits */ if (count >= 0) file_printf_flush((apr_vformatter_buff_t *)&data); va_end(ap); free(data.buf); return count; }
void str_buf_vprintf( str_buf_t *buf, const char *format, va_list args ) { str_buf_printf_data data; char tmp_buf[4096]; int count; data.buf = tmp_buf; data.vbuf.curpos = data.buf; data.vbuf.endpos = data.buf + 4096; data.str_buf = buf; count = apr_vformatter( str_buf_flush, (apr_vformatter_buff_t *) &data, format, args ); if ( count >= 0 ) { str_buf_flush( (apr_vformatter_buff_t *) &data ); } }