summaryrefslogtreecommitdiffstats
path: root/dimension/realize.c
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@gmail.com>2009-12-19 19:16:33 -0500
committerTavian Barnes <tavianator@gmail.com>2009-12-19 19:27:26 -0500
commit970ecabc1ad30fa74e58f3d4ad9ccf41baffb8b0 (patch)
treefd2d4eb68391a5b911d5a158a5506487d04a6298 /dimension/realize.c
parent51fda684667044e2fe3e56f28137ef5397ef03ee (diff)
downloaddimension-970ecabc1ad30fa74e58f3d4ad9ccf41baffb8b0.tar.xz
Implement a symbol table.
Diffstat (limited to 'dimension/realize.c')
-rw-r--r--dimension/realize.c27
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;