apfl/src/source_readers.c

56 lines
1.1 KiB
C
Raw Normal View History

#include <assert.h>
#include <string.h>
#include "apfl.h"
#include "alloc.h"
struct string_source_reader {
struct apfl_allocator allocator;
struct apfl_string_view sv;
size_t off;
};
bool
apfl_string_source_reader(void *opaque, char *buf, size_t *len, bool need)
{
(void)need;
struct string_source_reader *ctx = opaque;
size_t maxlen = *len;
size_t remain_len = ctx->sv.len - ctx->off;
*len = maxlen < remain_len ? maxlen : remain_len;
memcpy(buf, ctx->sv.bytes + ctx->off, *len);
ctx->off += *len;
assert(ctx->off <= ctx->sv.len);
return true;
}
void *
apfl_string_source_reader_new(struct apfl_allocator allocator, struct apfl_string_view sv)
{
struct string_source_reader *ctx = ALLOC_OBJ(allocator, struct string_source_reader);
if (ctx == NULL) {
return NULL;
}
ctx->allocator = allocator;
ctx->sv = sv;
ctx->off = 0;
return ctx;
}
void
apfl_string_source_reader_destroy(void *opaque)
{
struct string_source_reader *ctx = opaque;
if (ctx == NULL) {
return;
}
FREE_OBJ(ctx->allocator, ctx);
}