|
|
- #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);
|