#pragma once #include "stddef.h" #define INK_INTEGER 0 #define INK_NATIVE_FUNCTION 1 #define INK_FUNCTION 2 struct elem { int type; int value; }; struct stack_frame { struct elem executing; int index; }; struct fn { char* name; struct elem* things; int size; }; struct context; struct native_fn { char* name; void(*value)(struct context*); }; struct context { int panic; void*(*malloc)(size_t); void*(*realloc)(void*, size_t); void(*free)(void*); int(*putchar)(int); struct elem* stack; int capacity; int top; struct stack_frame* function_stack; int function_stack_capacity; int function_stack_top; struct native_fn* native_words; int native_words_capacity; int native_words_top; struct fn* words; int words_capacity; int words_top; char** lex_reserved_words; int lex_reserved_words_capacity; int lex_reserved_words_top; }; int ink_add_native(struct context* ctx, const char* name, void(*value)(struct context*)); int ink_push(struct context* ctx, struct elem value); int ink_push_fn(struct context* ctx, struct stack_frame value); struct context* ink_make_context(void*(*malloc)(size_t), void*(*realloc)(void*, size_t), void(*free)(void*), int(*putchar)(int)); #ifndef NOSTDLIB struct context* ink_make_default_context(); #endif int ink_step(struct context *pContext); void ink_run(struct context *pContext, char* buffer); int ink_std_library(struct context* ctx);