1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 5 #include "output_buffer.h" 6 #include "../log.h" 7 #include "../minmax.h" 8 9 #define BUF_INC 1024 10 11 void buf_output_init(struct buf_output *out) 12 { 13 out->max_buflen = 0; 14 out->buflen = 0; 15 out->buf = NULL; 16 } 17 18 void buf_output_free(struct buf_output *out) 19 { 20 free(out->buf); 21 } 22 23 size_t buf_output_add(struct buf_output *out, const char *buf, size_t len) 24 { 25 if (out->max_buflen - out->buflen < len) { 26 size_t need = len - (out->max_buflen - out->buflen); 27 size_t old_max = out->max_buflen; 28 29 need = max((size_t) BUF_INC, need); 30 out->max_buflen += need; 31 out->buf = realloc(out->buf, out->max_buflen); 32 33 old_max = max(old_max, out->buflen + len); 34 if (old_max + need > out->max_buflen) 35 need = out->max_buflen - old_max; 36 memset(&out->buf[old_max], 0, need); 37 } 38 39 memcpy(&out->buf[out->buflen], buf, len); 40 out->buflen += len; 41 return len; 42 } 43 44 size_t buf_output_flush(struct buf_output *out) 45 { 46 size_t ret = 0; 47 48 if (out->buflen) { 49 ret = log_info_buf(out->buf, out->buflen); 50 memset(out->buf, 0, out->max_buflen); 51 out->buflen = 0; 52 } 53 54 return ret; 55 } 56