Browse Source

Added README.md contents

main
Ludovic 'Archivist' Lagouardette 4 months ago
parent
commit
0706677e2f
5 changed files with 75 additions and 30 deletions
  1. +3
    -2
      CMakeLists.txt
  2. +14
    -0
      LICENSE
  3. +17
    -0
      README.md
  4. +40
    -27
      ink.h
  5. +1
    -1
      lib.c

+ 3
- 2
CMakeLists.txt View File

@ -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)

+ 14
- 0
LICENSE View File

@ -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.

+ 17
- 0
README.md View File

@ -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.

+ 40
- 27
ink.h View File

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

+ 1
- 1
lib.c View File

@ -4,7 +4,7 @@
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#ifndef NOINSTR
#ifdef INSTRUMENTION
#include <time.h>
#endif
#endif

Loading…
Cancel
Save