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