#include #include #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); }