diff options
author | Tavian Barnes <tavianator@gmail.com> | 2009-12-19 19:16:33 -0500 |
---|---|---|
committer | Tavian Barnes <tavianator@gmail.com> | 2009-12-19 19:27:26 -0500 |
commit | 970ecabc1ad30fa74e58f3d4ad9ccf41baffb8b0 (patch) | |
tree | fd2d4eb68391a5b911d5a158a5506487d04a6298 /dimension/realize.c | |
parent | 51fda684667044e2fe3e56f28137ef5397ef03ee (diff) | |
download | dimension-970ecabc1ad30fa74e58f3d4ad9ccf41baffb8b0.tar.xz |
Implement a symbol table.
Diffstat (limited to 'dimension/realize.c')
-rw-r--r-- | dimension/realize.c | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/dimension/realize.c b/dimension/realize.c index a4b8df5..eda7056 100644 --- a/dimension/realize.c +++ b/dimension/realize.c @@ -540,7 +540,7 @@ dmnsn_realize_sphere(dmnsn_astnode astnode) } static dmnsn_scene * -dmnsn_realize_astree(const dmnsn_array *astree) +dmnsn_realize_astree(const dmnsn_astree *astree) { dmnsn_scene *scene = dmnsn_new_scene(); if (!scene) { @@ -612,24 +612,39 @@ dmnsn_realize_astree(const dmnsn_array *astree) } dmnsn_scene * -dmnsn_realize(FILE *file, const char *filename) +dmnsn_realize(FILE *file, dmnsn_symbol_table *symtable) { - dmnsn_array *astree = dmnsn_parse(file, filename); + if (!symtable) { + symtable = dmnsn_new_symbol_table(); + } + + dmnsn_astree *astree = dmnsn_parse(file, symtable); if (!astree) { return NULL; } - return dmnsn_realize_astree(astree); + + dmnsn_scene *scene = dmnsn_realize_astree(astree); + + dmnsn_delete_astree(astree); + return scene; } dmnsn_scene * -dmnsn_realize_string(const char *str) +dmnsn_realize_string(const char *str, dmnsn_symbol_table *symtable) { + if (!symtable) { + symtable = dmnsn_new_symbol_table(); + } + if (!dmnsn_find_symbol(symtable, "__file__")) { + dmnsn_push_symbol(symtable, "__file__", dmnsn_new_ast_string("<string>")); + } + FILE *file = fmemopen((void *)str, strlen(str), "r"); if (!file) { return NULL; } - dmnsn_scene *scene = dmnsn_realize(file, "<string>"); + dmnsn_scene *scene = dmnsn_realize(file, symtable); fclose(file); return scene; |