Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
aria.h@0:ead2fec64900, 2016-10-23 (annotated)
- 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?
User | Revision | Line number | New 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 |