90 lines
1.9 KiB
C
90 lines
1.9 KiB
C
|
#ifndef _mov_memory_buffer_h_
|
||
|
#define _mov_memory_buffer_h_
|
||
|
|
||
|
#include "mov-buffer.h"
|
||
|
#include <stddef.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <string.h>
|
||
|
#include <stdint.h>
|
||
|
#include <errno.h>
|
||
|
|
||
|
struct mov_memory_buffer_t
|
||
|
{
|
||
|
uint8_t* ptr;
|
||
|
uint64_t bytes;
|
||
|
|
||
|
uint64_t off;
|
||
|
uint64_t capacity;
|
||
|
uint64_t maxsize; // limit
|
||
|
};
|
||
|
|
||
|
static int mov_memory_read(void* param, void* data, uint64_t bytes)
|
||
|
{
|
||
|
struct mov_memory_buffer_t* ptr;
|
||
|
ptr = (struct mov_memory_buffer_t*)param;
|
||
|
if (ptr->off + bytes > ptr->bytes)
|
||
|
return -E2BIG;
|
||
|
|
||
|
memcpy(data, ptr->ptr + ptr->off, (size_t)bytes);
|
||
|
ptr->off += bytes;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int mov_memory_write(void* param, const void* data, uint64_t bytes)
|
||
|
{
|
||
|
void* p;
|
||
|
uint64_t capacity;
|
||
|
struct mov_memory_buffer_t* ptr;
|
||
|
ptr = (struct mov_memory_buffer_t*)param;
|
||
|
if (ptr->off + bytes > ptr->maxsize)
|
||
|
return -E2BIG;
|
||
|
|
||
|
if (ptr->off + bytes > ptr->capacity)
|
||
|
{
|
||
|
capacity = ptr->off + bytes + 1 * 1024 * 1024;
|
||
|
capacity = capacity > ptr->maxsize ? ptr->maxsize : capacity;
|
||
|
p = realloc(ptr->ptr, capacity);
|
||
|
if (NULL == p)
|
||
|
return -ENOMEM;
|
||
|
ptr->ptr = (uint8_t*)p;
|
||
|
ptr->capacity = capacity;
|
||
|
}
|
||
|
|
||
|
memcpy(ptr->ptr + ptr->off, data, bytes);
|
||
|
ptr->off += bytes;
|
||
|
|
||
|
if (ptr->off > ptr->bytes)
|
||
|
ptr->bytes = ptr->off;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int mov_memory_seek(void* param, int64_t offset)
|
||
|
{
|
||
|
struct mov_memory_buffer_t* ptr;
|
||
|
ptr = (struct mov_memory_buffer_t*)param;
|
||
|
if ((uint64_t)(offset >= 0 ? offset : -offset) > ptr->capacity)
|
||
|
return -E2BIG;
|
||
|
ptr->off = offset >= 0 ? offset : (ptr->capacity+offset);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int64_t mov_memory_tell(void* param)
|
||
|
{
|
||
|
struct mov_memory_buffer_t* ptr;
|
||
|
ptr = (struct mov_memory_buffer_t*)param;
|
||
|
return (int64_t)ptr->off;
|
||
|
}
|
||
|
|
||
|
static inline const struct mov_buffer_t* mov_memory_buffer(void)
|
||
|
{
|
||
|
static struct mov_buffer_t s_io = {
|
||
|
mov_memory_read,
|
||
|
mov_memory_write,
|
||
|
mov_memory_seek,
|
||
|
mov_memory_tell,
|
||
|
};
|
||
|
return &s_io;
|
||
|
}
|
||
|
|
||
|
#endif /* !_mov_memory_buffer_h_ */
|