#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 #ifdef __cplusplus extern "C" { #endif 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); #ifdef __cplusplus }; #endif