Jason Daniels / AriaLisp
Committer:
jdaniels
Date:
Sun Oct 23 00:31:25 2016 +0000
Revision:
0:ead2fec64900
Child:
1:47a38a2ca6db
got some display primitives implemented

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jdaniels 0:ead2fec64900 1 /**
jdaniels 0:ead2fec64900 2 * Copyright (c) 2016 rxi
jdaniels 0:ead2fec64900 3 *
jdaniels 0:ead2fec64900 4 * This library is free software; you can redistribute it and/or modify it
jdaniels 0:ead2fec64900 5 * under the terms of the MIT license. See LICENSE for details.
jdaniels 0:ead2fec64900 6 */
jdaniels 0:ead2fec64900 7
jdaniels 0:ead2fec64900 8 #ifndef ARIA_H
jdaniels 0:ead2fec64900 9 #define ARIA_H
jdaniels 0:ead2fec64900 10
jdaniels 0:ead2fec64900 11 #include <stdio.h>
jdaniels 0:ead2fec64900 12 #include <stdlib.h>
jdaniels 0:ead2fec64900 13 #include <stdarg.h>
jdaniels 0:ead2fec64900 14 #include <string.h>
jdaniels 0:ead2fec64900 15 #include <setjmp.h>
jdaniels 0:ead2fec64900 16 #include <ctype.h>
jdaniels 0:ead2fec64900 17
jdaniels 0:ead2fec64900 18 #define AR_VERSION "0.1.1"
jdaniels 0:ead2fec64900 19
jdaniels 0:ead2fec64900 20 #ifdef __cplusplus
jdaniels 0:ead2fec64900 21 extern "C" {
jdaniels 0:ead2fec64900 22 #endif
jdaniels 0:ead2fec64900 23
jdaniels 0:ead2fec64900 24 typedef struct ar_Value ar_Value;
jdaniels 0:ead2fec64900 25 typedef struct ar_State ar_State;
jdaniels 0:ead2fec64900 26 typedef struct ar_Chunk ar_Chunk;
jdaniels 0:ead2fec64900 27 typedef struct ar_Frame ar_Frame;
jdaniels 0:ead2fec64900 28 typedef struct ar_FuncMap ar_FuncMap;
jdaniels 0:ead2fec64900 29
jdaniels 0:ead2fec64900 30 /*
jdaniels 0:ead2fec64900 31 funcs[] = {
jdaniels 0:ead2fec64900 32 { "wait", &f_wait },
jdaniels 0:ead2fec64900 33 { NULL, NULL }
jdaniels 0:ead2fec64900 34 };
jdaniels 0:ead2fec64900 35 */
jdaniels 0:ead2fec64900 36
jdaniels 0:ead2fec64900 37
jdaniels 0:ead2fec64900 38 typedef void *(*ar_Alloc)(void *udata, void *ptr, size_t size);
jdaniels 0:ead2fec64900 39 typedef ar_Value* (*ar_CFunc)(ar_State *S, ar_Value* args);
jdaniels 0:ead2fec64900 40 typedef ar_Value* (*ar_Prim)(ar_State *S, ar_Value* args, ar_Value *env);
jdaniels 0:ead2fec64900 41
jdaniels 0:ead2fec64900 42
jdaniels 0:ead2fec64900 43 struct ar_Value {
jdaniels 0:ead2fec64900 44 unsigned char type, mark;
jdaniels 0:ead2fec64900 45 union {
jdaniels 0:ead2fec64900 46 struct { ar_Value *name; int line; } dbg;
jdaniels 0:ead2fec64900 47 struct { ar_Value *pair, *left, *right; } map;
jdaniels 0:ead2fec64900 48 struct { ar_Value *car, *cdr, *dbg; } pair;
jdaniels 0:ead2fec64900 49 struct { double n; } num;
jdaniels 0:ead2fec64900 50 struct { ar_Value *params, *body, *env; } func;
jdaniels 0:ead2fec64900 51 struct { void *ptr; ar_CFunc gc, mark; } udata;
jdaniels 0:ead2fec64900 52 struct { ar_Value *parent, *map; } env;
jdaniels 0:ead2fec64900 53 struct { ar_CFunc fn; } cfunc;
jdaniels 0:ead2fec64900 54 struct { ar_Prim fn; } prim;
jdaniels 0:ead2fec64900 55 struct { char *s; size_t len; unsigned hash; } str;
jdaniels 0:ead2fec64900 56 } u;
jdaniels 0:ead2fec64900 57 };
jdaniels 0:ead2fec64900 58
jdaniels 0:ead2fec64900 59
jdaniels 0:ead2fec64900 60 struct ar_Frame {
jdaniels 0:ead2fec64900 61 struct ar_Frame *parent; /* Parent stack frame */
jdaniels 0:ead2fec64900 62 ar_Value *caller; /* Calling function pair */
jdaniels 0:ead2fec64900 63 jmp_buf *err_env; /* Jumped to on error, if it exists */
jdaniels 0:ead2fec64900 64 int stack_idx; /* Index on stack where frame's values start */
jdaniels 0:ead2fec64900 65 };
jdaniels 0:ead2fec64900 66
jdaniels 0:ead2fec64900 67
jdaniels 0:ead2fec64900 68 struct ar_State {
jdaniels 0:ead2fec64900 69 ar_Alloc alloc; /* Allocator function */
jdaniels 0:ead2fec64900 70 void *udata; /* Pointer passed as allocator's udata */
jdaniels 0:ead2fec64900 71 ar_Value *global; /* Global environment */
jdaniels 0:ead2fec64900 72 ar_Frame base_frame; /* Base stack frame */
jdaniels 0:ead2fec64900 73 ar_Frame *frame; /* Current stack frame */
jdaniels 0:ead2fec64900 74 int frame_idx; /* Current stack frame index */
jdaniels 0:ead2fec64900 75 ar_Value *t; /* Symbol `t` */
jdaniels 0:ead2fec64900 76 ar_CFunc panic; /* Called if an unprotected error occurs */
jdaniels 0:ead2fec64900 77 ar_Value *err_args; /* Error args passed to error handler */
jdaniels 0:ead2fec64900 78 ar_Value *oom_error; /* Value thrown on an out of memory error */
jdaniels 0:ead2fec64900 79 ar_Value *oom_args; /* Args passed to err handler on out of mem */
jdaniels 0:ead2fec64900 80 ar_Value *parse_name; /* Parser's current chunk name */
jdaniels 0:ead2fec64900 81 int parse_line; /* Parser's current line */
jdaniels 0:ead2fec64900 82 ar_Value **gc_stack; /* Stack of values (protected from GC) */
jdaniels 0:ead2fec64900 83 int gc_stack_idx; /* Current index for the top of the gc_stack */
jdaniels 0:ead2fec64900 84 int gc_stack_cap; /* Max capacity of protected values stack */
jdaniels 0:ead2fec64900 85 ar_Chunk *gc_chunks; /* List of all chunks */
jdaniels 0:ead2fec64900 86 ar_Value *gc_pool; /* Dead (usable) Values */
jdaniels 0:ead2fec64900 87 int gc_count; /* Counts down number of new values until GC */
jdaniels 0:ead2fec64900 88 };
jdaniels 0:ead2fec64900 89
jdaniels 0:ead2fec64900 90 struct ar_FuncMap {
jdaniels 0:ead2fec64900 91 const char *name;
jdaniels 0:ead2fec64900 92 ar_CFunc fn;
jdaniels 0:ead2fec64900 93 };
jdaniels 0:ead2fec64900 94
jdaniels 0:ead2fec64900 95 enum {
jdaniels 0:ead2fec64900 96 AR_TNIL,
jdaniels 0:ead2fec64900 97 AR_TDBGINFO,
jdaniels 0:ead2fec64900 98 AR_TMAPNODE,
jdaniels 0:ead2fec64900 99 AR_TPAIR,
jdaniels 0:ead2fec64900 100 AR_TNUMBER,
jdaniels 0:ead2fec64900 101 AR_TSTRING,
jdaniels 0:ead2fec64900 102 AR_TSYMBOL,
jdaniels 0:ead2fec64900 103 AR_TFUNC,
jdaniels 0:ead2fec64900 104 AR_TMACRO,
jdaniels 0:ead2fec64900 105 AR_TPRIM,
jdaniels 0:ead2fec64900 106 AR_TCFUNC,
jdaniels 0:ead2fec64900 107 AR_TENV,
jdaniels 0:ead2fec64900 108 AR_TUDATA
jdaniels 0:ead2fec64900 109 };
jdaniels 0:ead2fec64900 110
jdaniels 0:ead2fec64900 111 #define ar_get_global(S,x) ar_eval(S, ar_new_symbol(S, x), (S)->global)
jdaniels 0:ead2fec64900 112 #define ar_bind_global(S,x,v) ar_bind(S, ar_new_symbol(S, x), v, (S)->global)
jdaniels 0:ead2fec64900 113 #define ar_call_global(S,f,a) ar_call(S, ar_get_global(S, f), a)
jdaniels 0:ead2fec64900 114 #define ar_bind_global_list(S,l) \
jdaniels 0:ead2fec64900 115 for (int i = 0; l[i].name; i++) \
jdaniels 0:ead2fec64900 116 ar_bind_global(S, l[i].name, ar_new_cfunc(S, l[i].fn)) \
jdaniels 0:ead2fec64900 117
jdaniels 0:ead2fec64900 118
jdaniels 0:ead2fec64900 119
jdaniels 0:ead2fec64900 120
jdaniels 0:ead2fec64900 121 #define ar_check_string(S,v) ar_to_string(S, ar_check(S, v, AR_TSTRING))
jdaniels 0:ead2fec64900 122 #define ar_check_udata(S,v) ar_to_udata(S, ar_check(S, v, AR_TUDATA))
jdaniels 0:ead2fec64900 123 #define ar_check_number(S,v) ar_to_number(S, ar_check(S, v, AR_TNUMBER))
jdaniels 0:ead2fec64900 124
jdaniels 0:ead2fec64900 125 #define ar_try(S, err_val, blk, err_blk) \
jdaniels 0:ead2fec64900 126 do { \
jdaniels 0:ead2fec64900 127 jmp_buf err_env__, *old_env__ = (S)->frame->err_env; \
jdaniels 0:ead2fec64900 128 S->frame->err_env = &err_env__; \
jdaniels 0:ead2fec64900 129 if (setjmp(err_env__)) { \
jdaniels 0:ead2fec64900 130 ar_Value *err_val = (S)->err_args; \
jdaniels 0:ead2fec64900 131 (S)->frame->err_env = old_env__; \
jdaniels 0:ead2fec64900 132 err_blk; \
jdaniels 0:ead2fec64900 133 } else { \
jdaniels 0:ead2fec64900 134 blk; \
jdaniels 0:ead2fec64900 135 (S)->frame->err_env = old_env__; \
jdaniels 0:ead2fec64900 136 } \
jdaniels 0:ead2fec64900 137 } while (0)
jdaniels 0:ead2fec64900 138
jdaniels 0:ead2fec64900 139 ar_State *ar_new_state(ar_Alloc alloc, void *udata);
jdaniels 0:ead2fec64900 140 void ar_close_state(ar_State *S);
jdaniels 0:ead2fec64900 141 ar_CFunc ar_at_panic(ar_State *S, ar_CFunc fn);
jdaniels 0:ead2fec64900 142 void ar_error(ar_State *S, ar_Value *err);
jdaniels 0:ead2fec64900 143 void ar_error_str(ar_State *S, const char *fmt, ...);
jdaniels 0:ead2fec64900 144
jdaniels 0:ead2fec64900 145 ar_Value *ar_new_env(ar_State *S, ar_Value *parent);
jdaniels 0:ead2fec64900 146 ar_Value *ar_new_pair(ar_State *S, ar_Value *car, ar_Value *cdr);
jdaniels 0:ead2fec64900 147 ar_Value *ar_new_list(ar_State *S, size_t n, ...);
jdaniels 0:ead2fec64900 148 ar_Value *ar_new_number(ar_State *S, double n);
jdaniels 0:ead2fec64900 149 ar_Value *ar_new_udata(ar_State *S, void *ptr, ar_CFunc gc, ar_CFunc mark);
jdaniels 0:ead2fec64900 150 ar_Value *ar_new_stringl(ar_State *S, const char *str, size_t len);
jdaniels 0:ead2fec64900 151 ar_Value *ar_new_string(ar_State *S, const char *str);
jdaniels 0:ead2fec64900 152 ar_Value *ar_new_symbol(ar_State *S, const char *name);
jdaniels 0:ead2fec64900 153 ar_Value *ar_new_cfunc(ar_State *S, ar_CFunc fn);
jdaniels 0:ead2fec64900 154 ar_Value *ar_new_prim(ar_State *S, ar_Prim fn);
jdaniels 0:ead2fec64900 155
jdaniels 0:ead2fec64900 156 int ar_type(ar_Value *v);
jdaniels 0:ead2fec64900 157 const char *ar_type_str(int type);
jdaniels 0:ead2fec64900 158 ar_Value *ar_check(ar_State *S, ar_Value *v, int type);
jdaniels 0:ead2fec64900 159 ar_Value *ar_car(ar_Value *v);
jdaniels 0:ead2fec64900 160 ar_Value *ar_cdr(ar_Value *v);
jdaniels 0:ead2fec64900 161 ar_Value *ar_nth(ar_Value *v, int idx);
jdaniels 0:ead2fec64900 162 ar_Value **ar_append_tail(ar_State *S, ar_Value **last, ar_Value *v);
jdaniels 0:ead2fec64900 163 ar_Value *ar_to_string_value(ar_State *S, ar_Value *v, int quotestr);
jdaniels 0:ead2fec64900 164
jdaniels 0:ead2fec64900 165 const char *ar_to_stringl(ar_State *S, ar_Value *v, size_t *len);
jdaniels 0:ead2fec64900 166 const char *ar_to_string(ar_State *S, ar_Value *v);
jdaniels 0:ead2fec64900 167 void *ar_to_udata(ar_State *S, ar_Value *v);
jdaniels 0:ead2fec64900 168 double ar_to_number(ar_State *S, ar_Value *v);
jdaniels 0:ead2fec64900 169 const char *ar_opt_string(ar_State *S, ar_Value *v, const char *def);
jdaniels 0:ead2fec64900 170 void *ar_opt_udata(ar_State *S, ar_Value *v, void *def);
jdaniels 0:ead2fec64900 171 double ar_opt_number(ar_State *S, ar_Value *v, double def);
jdaniels 0:ead2fec64900 172
jdaniels 0:ead2fec64900 173 ar_Value *ar_bind(ar_State *S, ar_Value *sym, ar_Value *v, ar_Value *env);
jdaniels 0:ead2fec64900 174 ar_Value *ar_set(ar_State *S, ar_Value *sym, ar_Value *v, ar_Value *env);
jdaniels 0:ead2fec64900 175
jdaniels 0:ead2fec64900 176 void ar_mark(ar_State *S, ar_Value *v);
jdaniels 0:ead2fec64900 177 void ar_gc(ar_State *S);
jdaniels 0:ead2fec64900 178
jdaniels 0:ead2fec64900 179 ar_Value *ar_parse(ar_State *S, const char *str, const char *name);
jdaniels 0:ead2fec64900 180 ar_Value *ar_eval(ar_State *S, ar_Value *v, ar_Value *env);
jdaniels 0:ead2fec64900 181 ar_Value *ar_call(ar_State *S, ar_Value *fn, ar_Value *args);
jdaniels 0:ead2fec64900 182 ar_Value *ar_do_list(ar_State *S, ar_Value *body, ar_Value *env);
jdaniels 0:ead2fec64900 183 ar_Value *ar_do_string(ar_State *S, const char *str);
jdaniels 0:ead2fec64900 184 ar_Value *ar_do_file(ar_State *S, const char *filename);
jdaniels 0:ead2fec64900 185
jdaniels 0:ead2fec64900 186
jdaniels 0:ead2fec64900 187 #ifdef __cplusplus
jdaniels 0:ead2fec64900 188 }
jdaniels 0:ead2fec64900 189 #endif
jdaniels 0:ead2fec64900 190
jdaniels 0:ead2fec64900 191 #endif
jdaniels 0:ead2fec64900 192