A minimalistic programming language written in C89.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

105 lines
2.0 KiB

#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