#pragma once #include "stddef.h" #define INK_INTEGER 0 #define INK_NATIVE_FUNCTION 1 #define INK_FUNCTION 2 #define INK_ROUTINE_CAN_REUSE 32 #define INK_ROUTINE_SUCCESS 1 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 ink_routine { int panic; struct elem* stack; int capacity; int top; struct stack_frame* function_stack; int function_stack_capacity; int function_stack_top; void* routine_userdata; }; struct context { int panic; void*(*malloc)(size_t); void*(*realloc)(void*, size_t); void(*free)(void*); int(*putchar)(int); struct ink_routine* routines; int routines_capacity; int routines_top; int routine_current; 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; unsigned int steps; void* persistent_userdata; }; int ink_make_routine(struct context* ctx); int ink_kill_routine(struct context* ctx, int routine); 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); int ink_can_run(struct context *pContext); int ink_step_everyone(struct context* pContext); void ink_compile(struct context *pContext, char* buffer); int ink_std_library(struct context* ctx); void ink_pop_fn(struct context* ctx); void ink_pop(struct context* ctx);