diff --git a/CMakeLists.txt b/CMakeLists.txt index f7a54e1..65bbea2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,5 +7,6 @@ add_library(ink lib.c ink.h) add_executable(ink_exe main.c) target_link_libraries(ink_exe PUBLIC ink) -add_executable(ink_bench bench.c) -target_link_libraries(ink_bench PUBLIC ink) +# Benchmark is broken since the addition to coroutines +# add_executable(ink_bench bench.c) +# target_link_libraries(ink_bench PUBLIC ink) diff --git a/LICENSE b/LICENSE index e69de29..7041392 100644 --- a/LICENSE +++ b/LICENSE @@ -0,0 +1,14 @@ +Copyright (c) 2024 Ludovic Lagouardette + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md index e69de29..dc6c921 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,17 @@ +# `ink` + +`ink` is a minimalistic interpreted programming language, tentatively implemented exclusively in C98. It features +coroutines and can currently only manipulate integers. Part of the code may not be compliant with C98 and I will try to +fix that in time. + +It is fully self-contained and doesn't rely on a working standard library beyond the following: + +- `malloc` +- `realloc` +- `free` +- `putchar` + +To make the library not use the standard library, build it with `NOSTDLIB` defined as a preprocessor directive. + +All of these functions need to work for `ink` to work. It is easy to add new functions to the interpreter. In the +future, I will add a garbage collector to handle cleaning dynamically allocated resources. diff --git a/ink.h b/ink.h index 545bd4e..77188a2 100644 --- a/ink.h +++ b/ink.h @@ -8,6 +8,10 @@ #define INK_ROUTINE_CAN_REUSE 32 #define INK_ROUTINE_SUCCESS 1 +#ifdef __cplusplus +extern "C" { +#endif + struct elem { int type; int value; @@ -19,74 +23,83 @@ struct stack_frame { }; struct fn { - char* name; - struct elem* things; + char *name; + struct elem *things; int size; }; struct context; struct native_fn { - char* name; - void(*value)(struct context*); + char *name; + + void (*value)(struct context *); }; struct ink_routine { int panic; - struct elem* stack; + struct elem *stack; int capacity; int top; - struct stack_frame* function_stack; + struct stack_frame *function_stack; int function_stack_capacity; int function_stack_top; - void* routine_userdata; + 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; + 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; + struct native_fn *native_words; int native_words_capacity; int native_words_top; - struct fn* words; + struct fn *words; int words_capacity; int words_top; - char** lex_reserved_words; + char **lex_reserved_words; int lex_reserved_words_capacity; int lex_reserved_words_top; unsigned int steps; - void* persistent_userdata; + 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)); +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); \ No newline at end of file +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 \ No newline at end of file diff --git a/lib.c b/lib.c index 745f5dd..b12366e 100644 --- a/lib.c +++ b/lib.c @@ -4,7 +4,7 @@ #include #include #include -#ifndef NOINSTR +#ifdef INSTRUMENTION #include #endif #endif