34#define RETURN_IF_INVALID(b) if(!buffer_is_valid(b)) return 
   35#define RETURN_VAL_IF_INVALID(b, v) if(!buffer_is_valid(b)) return v 
   36#define BUFFER_LIMIT (SSIZE_MAX - 1) 
   37#define EXCEEDS_BUFFER_MAX_SIZE(buf, len) buf->max_size - buf->len < len 
   43    assert(max_size > 0 && max_size <= BUFFER_LIMIT);
 
 
   62    assert(max_size > 0 && max_size <= BUFFER_LIMIT);
 
   64    memset(buf, 0, 
sizeof(
Buffer));
 
 
  109    RETURN_VAL_IF_INVALID(buf, 0);
 
 
  127    RETURN_VAL_IF_INVALID(buf, 
false);
 
  129    return buf->
len == 0;
 
 
  133_buffer_new_realloc_size(
size_t from, 
size_t to)
 
  156    assert(data != NULL);
 
  158    RETURN_VAL_IF_INVALID(buf, 
false);
 
  160    if(EXCEEDS_BUFFER_MAX_SIZE(buf, len))
 
  162        fprintf(stderr, 
"%s(): buffer exceeds allowed maximum size.\n", __func__);
 
  169            size_t new_size = _buffer_new_realloc_size(buf->
msize, buf->
msize + len);
 
  171            buf->
msize = new_size;
 
  172            buf->
data = (
char *)realloc(buf->
data, new_size);
 
  181        memcpy(buf->
data + buf->
len, data, len);
 
 
  193    assert(count <= buf->max_size);
 
  195    RETURN_VAL_IF_INVALID(buf, 0);
 
  200    if((bytes = read(fd, data, count)) > 0)
 
 
  216_buffer_copy_to_string(
const Buffer *buf, 
size_t count, 
char **dst, 
size_t *len)
 
  221    assert(count <= buf->len);
 
  226        *dst = (
char *)realloc(*dst, count + 1);
 
  235    memcpy(*dst, buf->
data, count);
 
  236    (*dst)[count] = 
'\0';
 
  246    RETURN_VAL_IF_INVALID(buf, 
false);
 
  251    if((ptr = memchr(buf->
data, 
'\n', buf->
len)))
 
  253        size_t slen = ptr - buf->
data;
 
  255        _buffer_copy_to_string(buf, slen, dst, len);
 
  257        buf->
len -= slen + 1;
 
  258        memmove(buf->
data, ptr + 1, buf->
len);
 
 
  273    RETURN_VAL_IF_INVALID(buf, 
false);
 
  275    bool flushed = 
false;
 
  279        _buffer_copy_to_string(buf, buf->
len, dst, len);
 
 
  291    RETURN_VAL_IF_INVALID(buf, NULL);
 
  297        str = (
char *)malloc(buf->
len + 1);
 
  305        memcpy(str, buf->
data, buf->
len);
 
  306        str[buf->
len] = 
'\0';
 
 
Buffer * buffer_new(size_t max_size)
ssize_t buffer_fill_from_fd(Buffer *buf, int fd, size_t count)
bool buffer_flush(const Buffer *buf, char **dst, size_t *len)
bool buffer_fill(Buffer *buf, const char *data, size_t len)
bool buffer_is_empty(const Buffer *buf)
char * buffer_to_string(const Buffer *buf)
size_t buffer_len(const Buffer *buf)
void buffer_destroy(Buffer *buf)
bool buffer_read_line(Buffer *buf, char **dst, size_t *len)
void buffer_clear(Buffer *buf)
bool buffer_is_valid(const Buffer *buf)
void buffer_init(Buffer *buf, size_t max_size)
void buffer_free(Buffer *buf)
A byte buffer. If the data exceeds the maximum length the buffer becomes invalid and new data is igno...