apfl/src/source_readers.c

39 lines
881 B
C
Raw Normal View History

#include <assert.h>
#include <string.h>
#include "apfl.h"
static bool
reader_callback(void *opaque, char *buf, size_t *len, bool need)
{
(void)need;
struct apfl_string_source_reader_data *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;
}
struct apfl_string_source_reader_data
apfl_string_source_reader_create(struct apfl_string_view sv)
{
return (struct apfl_string_source_reader_data) {
.sv = sv,
.off = 0,
};
}
struct apfl_source_reader apfl_string_source_reader(struct apfl_string_source_reader_data *data)
{
return (struct apfl_source_reader) {
.callback = reader_callback,
.opaque = data,
};
}