67 lines
1.2 KiB
C
67 lines
1.2 KiB
C
#pragma once
|
|
|
|
#include "common.h"
|
|
|
|
typedef struct buffer buffer_t;
|
|
|
|
struct buffer {
|
|
uint8_t *data;
|
|
uint8_t *read;
|
|
uint8_t *write;
|
|
uint8_t *end;
|
|
};
|
|
|
|
static inline void buffer_setup (buffer_t *buffer, void *data, size_t size)
|
|
{
|
|
if (!data)
|
|
data = malloc(ALIGN(size));
|
|
|
|
buffer->data = data;
|
|
buffer->read = data;
|
|
buffer->write = data;
|
|
buffer->end = data;
|
|
buffer->end += size;
|
|
}
|
|
|
|
static inline void buffer_format (buffer_t *buffer)
|
|
{
|
|
buffer->write = buffer->data;
|
|
buffer->read = buffer->data;
|
|
}
|
|
|
|
_pure_
|
|
static inline size_t buffer_size (buffer_t *buffer)
|
|
{
|
|
return buffer->end-buffer->data;
|
|
}
|
|
|
|
_pure_
|
|
static inline size_t buffer_write_size (buffer_t *buffer)
|
|
{
|
|
return buffer->end-buffer->write;
|
|
}
|
|
|
|
_pure_
|
|
static inline size_t buffer_read_size (buffer_t *buffer)
|
|
{
|
|
return buffer->write-buffer->read;
|
|
}
|
|
|
|
static inline void buffer_shift (buffer_t *buffer)
|
|
{
|
|
if (buffer->read==buffer->data)
|
|
return;
|
|
|
|
if (buffer->read==buffer->write) {
|
|
buffer_format(buffer);
|
|
return;
|
|
}
|
|
|
|
const size_t size = buffer_read_size(buffer);
|
|
|
|
memmove(buffer->data, buffer->read, size);
|
|
|
|
buffer->read = buffer->data;
|
|
buffer->write = buffer->data+size;
|
|
}
|