#ifndef H_SATORI_BUFFER
#define H_SATORI_BUFFER

#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

#define SAT_BUFFER_PIECE_SIZE (1024)
#define SAT_BUFFER_PIECE_MAX (SAT_BUFFER_PIECE_SIZE - 1)

typedef struct _sat_buffer_piece {
    struct _sat_buffer_piece *next;
    char data[SAT_BUFFER_PIECE_SIZE];
} sat_buffer_piece, *sat_buffer_piece_ptr;

typedef struct _sat_buffer {
    size_t available;
    sat_buffer_piece_ptr start;

    size_t rPos;
    sat_buffer_piece_ptr rCurrent;

    size_t wPos;
    sat_buffer_piece_ptr wCurrent;
} sat_buffer, *sat_buffer_ptr;

sat_buffer_ptr sat_buffer_alloc(void);
void sat_buffer_free(sat_buffer_ptr buffer);

bool sat_buffer_pending(sat_buffer_ptr buffer);
size_t sat_buffer_available(sat_buffer_ptr buffer);
void sat_buffer_tidy(sat_buffer_ptr buffer);

int sat_buffer_write(sat_buffer_ptr buffer, char *source, size_t count);
void sat_buffer_putc(sat_buffer_ptr buffer, char value);

int sat_buffer_read(sat_buffer_ptr buffer, char *target, size_t length);
char sat_buffer_getc(sat_buffer_ptr buffer);

#endif // H_SATORI_BUFFER