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