#ifndef KIT_INPUT_BUFFER_H #define KIT_INPUT_BUFFER_H #include "string_builder.h" #include "input_stream.h" #ifdef __cplusplus extern "C" { #endif typedef struct { kit_is_handle_t upstream; kit_str_builder_t data; } kit_input_buffer_t; typedef struct { s32 status; i64 offset; i64 size; kit_input_buffer_t *buffer; } kit_ib_token_t; typedef b8 (*kit_ib_read_condition_fn)(kit_str_t data, void *context); kit_input_buffer_t kit_ib_wrap(kit_is_handle_t upstream, kit_allocator_t *alloc); void kit_ib_destroy(kit_input_buffer_t *buf); kit_ib_token_t kit_ib_token(kit_input_buffer_t *buf); kit_str_t kit_ib_str(kit_ib_token_t tok); kit_ib_token_t kit_ib_read(kit_ib_token_t tok, i64 size); kit_ib_token_t kit_ib_any(kit_ib_token_t tok, kit_str_t data); kit_ib_token_t kit_ib_none(kit_ib_token_t tok, kit_str_t data); kit_ib_token_t kit_ib_exact(kit_ib_token_t tok, kit_str_t data); kit_ib_token_t kit_ib_until(kit_ib_token_t tok, kit_str_t data); kit_ib_token_t kit_ib_while(kit_ib_token_t buf, kit_ib_read_condition_fn condition, void *context); #define KIT_IB_SKIP(buf_, proc_, ...) \ do { \ kit_ib_token_t temp_buf_ = (buf_); \ (buf_) = proc_((buf_), __VA_ARGS__); \ } while (0) #ifdef __cplusplus } #endif #define input_buffer_t kit_input_buffer_t #define ib_token_t kit_ib_token_t #define ib_read_condition_fn kit_ib_read_condition_fn #define ib_wrap kit_ib_wrap #define ib_destroy kit_ib_destroy #define ib_token kit_ib_token #define ib_str kit_ib_str #define ib_read kit_ib_read #define ib_any kit_ib_any #define ib_none kit_ib_none #define ib_exact kit_ib_exact #define ib_until kit_ib_until #define ib_while kit_ib_while #define IB_SKIP KIT_IB_SKIP #endif