#ifndef WIT_INTERPRETER_H
#define WIT_INTERPRETER_H
#include <stddef.h>
#include <stdint.h>
#include <stdbool.h>
typedef uint32_t wit_type_t;
#define WIT_TYPE_KIND(ty) ((ty) & 0xff)
#define WIT_TYPE_INDEX(ty) ((ty) >> 8)
#define WIT_TYPE_U8 0
#define WIT_TYPE_U16 1
#define WIT_TYPE_U32 2
#define WIT_TYPE_U64 3
#define WIT_TYPE_S8 4
#define WIT_TYPE_S16 5
#define WIT_TYPE_S32 6
#define WIT_TYPE_S64 7
#define WIT_TYPE_BOOL 8
#define WIT_TYPE_CHAR 9
#define WIT_TYPE_F32 10
#define WIT_TYPE_F64 11
#define WIT_TYPE_STRING 12
#define WIT_TYPE_ERROR_CONTEXT 13
#define WIT_TYPE_RECORD 14
#define WIT_TYPE_OWN 15
#define WIT_TYPE_BORROW 16
#define WIT_TYPE_FLAGS 17
#define WIT_TYPE_TUPLE 18
#define WIT_TYPE_VARIANT 19
#define WIT_TYPE_ENUM 20
#define WIT_TYPE_OPTION 21
#define WIT_TYPE_RESULT 22
#define WIT_TYPE_LIST 23
#define WIT_TYPE_FIXED_SIZE_LIST 24
#define WIT_TYPE_FUTURE 25
#define WIT_TYPE_STREAM 26
#define WIT_TYPE_ALIAS 27
#define WIT_TYPE_EMPTY 0xff
typedef void(*wit_import_fn_t)(void* cx);
typedef uint32_t(*wit_import_async_fn_t)(void* cx, void *abi_area);
typedef void(*wit_import_async_lift_fn_t)(void* cx, void *abi_area);
typedef void(*wit_export_task_return_fn_t)(void* cx);
typedef struct wit_func {
const char *interface;
const char *name;
wit_import_fn_t impl;
wit_import_async_fn_t async_impl;
wit_import_async_lift_fn_t async_lift_impl;
wit_export_task_return_fn_t task_return;
size_t nparams;
const wit_type_t *params;
wit_type_t result;
size_t async_abi_area_size;
size_t async_abi_area_align;
} wit_func_t;
typedef void(*wit_resource_drop_t)(uint32_t);
typedef uint32_t(*wit_resource_new_t)(size_t);
typedef size_t(*wit_resource_rep_t)(uint32_t);
typedef struct wit_resource {
const char *interface;
const char *name;
wit_resource_drop_t drop;
wit_resource_new_t new; wit_resource_rep_t rep; } wit_resource_t;
typedef struct wit_field {
const char *name;
wit_type_t ty;
} wit_field_t;
typedef struct wit_record {
const char *interface;
const char *name;
size_t nfields;
const wit_field_t *fields;
} wit_record_t;
typedef struct wit_flags {
const char *interface;
const char *name;
size_t nnames;
const char **names;
} wit_flags_t;
typedef struct wit_tuple {
const char *interface;
const char *name;
size_t ntypes;
const wit_type_t *types;
} wit_tuple_t;
typedef struct wit_case {
const char *name;
wit_type_t ty;
} wit_case_t;
typedef struct wit_variant {
const char *interface;
const char *name;
size_t ncases;
const wit_case_t *cases;
} wit_variant_t;
typedef struct wit_enum {
const char *interface;
const char *name;
size_t nnames;
const char **names;
} wit_enum_t;
typedef struct wit_option {
const char *interface;
const char *name;
wit_type_t ty;
} wit_option_t;
typedef struct wit_result {
const char *interface;
const char *name;
wit_type_t ok;
wit_type_t err;
} wit_result_t;
typedef struct wit_list {
const char *interface;
const char *name;
wit_type_t ty;
} wit_list_t;
typedef struct wit_fixed_size_list {
const char *interface;
const char *name;
size_t size;
wit_type_t ty;
} wit_fixed_size_list_t;
typedef struct wit_future {
const char *interface;
const char *name;
wit_type_t ty;
} wit_future_t;
typedef struct wit_stream {
const char *interface;
const char *name;
wit_type_t ty;
} wit_stream_t;
typedef struct wit_alias {
const char *interface;
const char *name;
wit_type_t ty;
} wit_alias_t;
#define WIT_V0 0
typedef struct wit {
uint32_t version;
size_t num_funcs;
const wit_func_t *funcs;
size_t num_resources;
const wit_resource_t *resources;
size_t num_records;
const wit_record_t *records;
size_t num_flags;
const wit_flags_t *flags;
size_t num_tuples;
const wit_tuple_t *tuples;
size_t num_variants;
const wit_variant_t *variants;
size_t num_enums;
const wit_enum_t *enums;
size_t num_options;
const wit_option_t *options;
size_t num_results;
const wit_result_t *results;
size_t num_lists;
const wit_list_t *lists;
size_t num_fixed_size_lists;
const wit_fixed_size_list_t *fixed_size_lists;
size_t num_futures;
const wit_future_t *futures;
size_t num_streams;
const wit_stream_t *streams;
size_t num_aliases;
const wit_alias_t *aliases;
} wit_t;
void wit_dylib_initialize(const wit_t* wit);
void wit_dylib_dealloc_bytes(void *cx, void *ptr, size_t byte_size, size_t align, bool defer);
void *wit_dylib_export_start(size_t which);
void wit_dylib_export_call(void *cx, size_t which);
void wit_dylib_export_finish(void *cx, size_t which);
void wit_dylib_resource_dtor(size_t ty, size_t handle);
void wit_dylib_push_bool(void *cx, bool val);
void wit_dylib_push_char(void *cx, uint32_t val);
void wit_dylib_push_u8(void *cx, uint8_t val);
void wit_dylib_push_s8(void *cx, int8_t val);
void wit_dylib_push_u16(void *cx, uint16_t val);
void wit_dylib_push_s16(void *cx, int16_t val);
void wit_dylib_push_u32(void *cx, uint32_t val);
void wit_dylib_push_s32(void *cx, int32_t val);
void wit_dylib_push_u64(void *cx, uint64_t val);
void wit_dylib_push_s64(void *cx, int64_t val);
void wit_dylib_push_f32(void *cx, float val);
void wit_dylib_push_f64(void *cx, double val);
void wit_dylib_push_flags(void *cx, size_t ty, uint32_t flags);
void wit_dylib_push_enum(void *cx, size_t ty, uint32_t enum_);
void wit_dylib_push_borrow(void *cx, size_t ty, uint32_t handle);
void wit_dylib_push_own(void *cx, size_t ty, uint32_t handle);
void wit_dylib_push_future(void *cx, size_t ty, uint32_t handle);
void wit_dylib_push_stream(void *cx, size_t ty, uint32_t handle);
void wit_dylib_push_string(void *cx, uint8_t *bytes, size_t len);
void wit_dylib_push_record(void *cx, size_t ty);
void wit_dylib_push_tuple(void *cx, size_t ty);
void wit_dylib_push_option(void *cx, size_t ty, uint32_t discr);
void wit_dylib_push_result(void *cx, size_t ty, uint32_t discr);
void wit_dylib_push_variant(void *cx, size_t ty, uint32_t discr);
bool wit_dylib_push_list(void *cx, size_t ty, uint8_t *bytes, size_t len);
void wit_dylib_list_append(void *cx, size_t ty);
uint8_t wit_dylib_pop_u8(void *cx);
uint16_t wit_dylib_pop_u16(void *cx);
uint32_t wit_dylib_pop_u32(void *cx);
uint64_t wit_dylib_pop_u64(void *cx);
int8_t wit_dylib_pop_s8(void *cx);
int16_t wit_dylib_pop_s16(void *cx);
int32_t wit_dylib_pop_s32(void *cx);
int64_t wit_dylib_pop_s64(void *cx);
float wit_dylib_pop_f32(void *cx);
double wit_dylib_pop_f64(void *cx);
bool wit_dylib_pop_bool(void *cx);
uint32_t wit_dylib_pop_char(void *cx);
uint32_t wit_dylib_pop_borrow(void *cx, size_t ty);
uint32_t wit_dylib_pop_own(void *cx, size_t ty);
uint32_t wit_dylib_pop_enum(void *cx, size_t ty);
uint32_t wit_dylib_pop_flags(void *cx, size_t ty);
uint32_t wit_dylib_pop_future(void *cx, size_t ty);
uint32_t wit_dylib_pop_stream(void *cx, size_t ty);
size_t wit_dylib_pop_string(void *cx, char **ptr);
uint32_t wit_dylib_pop_option(void *cx, size_t type_index);
uint32_t wit_dylib_pop_result(void *cx, size_t type_index);
uint32_t wit_dylib_pop_variant(void *cx, size_t type_index);
void wit_dylib_pop_record(void *cx, size_t ty);
void wit_dylib_pop_tuple(void *cx, size_t ty);
size_t wit_dylib_pop_list(void *cx, size_t ty, void **ptr);
void wit_dylib_pop_iter_next(void *cx, size_t ty);
void wit_dylib_pop_iter(void *cx, size_t ty);
#endif