summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2008-10-26 12:51:57 +0000
committerPaul Buetow <paul@buetow.org>2008-10-26 12:51:57 +0000
commita1c3f47491b98cd9026f8e853cc9e72630805c12 (patch)
treeec2ea29640b43f2c1f820fd3fee317beec27d130 /src
parent380eacd0f4037ec00f37ad5b5e4baa18301cf3dd (diff)
added the "scope" function
Diffstat (limited to 'src')
-rw-r--r--src/build.h2
-rw-r--r--src/core/function.c7
-rw-r--r--src/core/scope.c17
-rw-r--r--src/core/scope.h1
-rw-r--r--src/core/symbol.c46
-rw-r--r--src/core/symbol.h3
-rw-r--r--src/data/hash.c13
-rw-r--r--src/data/hash.h3
-rw-r--r--src/data/stack.c29
-rw-r--r--src/data/stack.h4
-rw-r--r--src/defines.h2
11 files changed, 117 insertions, 10 deletions
diff --git a/src/build.h b/src/build.h
index d0cf034..303e86b 100644
--- a/src/build.h
+++ b/src/build.h
@@ -35,7 +35,7 @@
#ifndef BUILD_H
#define BUILD_H
-#define BUILDNR 9260
+#define BUILDNR 9299
#define OS_FREEBSD
#endif
diff --git a/src/core/function.c b/src/core/function.c
index a528aa1..8541960 100644
--- a/src/core/function.c
+++ b/src/core/function.c
@@ -524,6 +524,7 @@ function_process(Interpret *p_interpret, Token *p_token_op,
_Bool
function_is_buildin(Token *p_token_ident) {
+ /* TODO: optimize this function */
if (strcmp("assert", token_get_val(p_token_ident)) == 0)
return (true);
@@ -563,6 +564,9 @@ function_is_buildin(Token *p_token_ident) {
if (strcmp("put", token_get_val(p_token_ident)) == 0)
return (true);
+ if (strcmp("scope", token_get_val(p_token_ident)) == 0)
+ return (true);
+
if (strcmp("say", token_get_val(p_token_ident)) == 0)
return (true);
@@ -751,6 +755,9 @@ function_process_buildin(Interpret *p_interpret, Token *p_token_ident,
}
stackiterator_delete(p_iter);
+ } else if (strcmp("scope", token_get_val(p_token_ident)) == 0) {
+ scope_print(p_interpret->p_scope);
+
} else if (strcmp("say", token_get_val(p_token_ident)) == 0) {
StackIterator *p_iter = stackiterator_new(p_stack_args);
while (stackiterator_has_next(p_iter)) {
diff --git a/src/core/scope.c b/src/core/scope.c
index 2a19390..8c3d4bf 100644
--- a/src/core/scope.c
+++ b/src/core/scope.c
@@ -150,8 +150,19 @@ scope_newset(Scope *p_scope, char *c_key, Symbol *p_symbol) {
}
void
-scopes_print(Scope *p_scope) {
+_scope_print_cb(void *p_void, int i_level) {
+ Hash *p_hash_syms = p_void;
+ if (i_level > 0)
+ printf("%d level(s) up:\n", i_level);
+ hash_iterate_key(p_hash_syms, symbol_print_cb);
+}
+
+void
+scope_print(Scope *p_scope) {
printf("Scopes:\n");
- printf("Scope stack size: %d\n", p_scope->p_stack_scopes);
-
+ printf("Scope stack size: %d\n", stack_size(p_scope->p_stack_scopes));
+ printf("Global symbols:\n");
+ hash_iterate_key(p_scope->p_hash_global, symbol_print_cb);
+ printf("Local symbols:\n");
+ stack_iterate_level(p_scope->p_stack_scopes, _scope_print_cb);
}
diff --git a/src/core/scope.h b/src/core/scope.h
index be29e67..4954344 100644
--- a/src/core/scope.h
+++ b/src/core/scope.h
@@ -40,7 +40,6 @@
#include "../defines.h"
#include "symbol.h"
-
typedef struct {
Hash *p_hash_global;
Stack *p_stack_scopes;
diff --git a/src/core/symbol.c b/src/core/symbol.c
index 8c39f5c..ef5957b 100644
--- a/src/core/symbol.c
+++ b/src/core/symbol.c
@@ -35,6 +35,7 @@
#include "symbol.h"
#include "../data/list.h"
+#include "token.h"
Symbol*
symbol_new(SymbolType sym, void *p_val) {
@@ -67,3 +68,48 @@ void
symbol_cleanup_hash_syms_cb(void *p_void) {
symbol_delete(p_void);
}
+
+void
+symbol_print(Symbol *p_symbol, char *c_key) {
+ printf("%s: %s", sym_get_name(p_symbol->sym), c_key);
+
+ switch (p_symbol->sym) {
+ case SYM_BUILDIN:
+ case SYM_CONSTANT:
+ break;
+ case SYM_PROCEDURE:
+ case SYM_FUNCTION:
+ //list_iterate(symbol_get_val(p_symbol), token_print_cb);
+ break;
+ case SYM_VARIABLE:
+ printf(" ");
+ token_print(symbol_get_val(p_symbol));
+ break;
+ }
+
+ printf("\n");
+}
+
+void
+symbol_print_cb(void *p_void, char *c_key) {
+ symbol_print(p_void, c_key);
+}
+
+char*
+sym_get_name(SymbolType sym) {
+ switch (sym) {
+ case SYM_CONSTANT:
+ return ("SYM_CONSTANT");
+ case SYM_VARIABLE:
+ return ("SYM_VARIABLE");
+ case SYM_BUILDIN:
+ return ("SYM_BUILDIN");
+ case SYM_PROCEDURE:
+ return ("SYM_PROCEDURE");
+ case SYM_FUNCTION:
+ return ("SYM_FUNCTION");
+ }
+
+ // Never reach this point
+ return ("NONE");
+}
diff --git a/src/core/symbol.h b/src/core/symbol.h
index 2abc67e..e0f8337 100644
--- a/src/core/symbol.h
+++ b/src/core/symbol.h
@@ -62,5 +62,8 @@ typedef struct {
Symbol* symbol_new(SymbolType sym, void *p_val);
void symbol_delete(Symbol *p_symbol);
void symbol_cleanup_hash_syms_cb(void *p_void);
+void symbol_print(Symbol *p_symbol, char *c_key);
+void symbol_print_cb(void *p_void, char *c_key);
+char* sym_get_name(SymbolType sym);
#endif
diff --git a/src/data/hash.c b/src/data/hash.c
index 3c01042..53a1b50 100644
--- a/src/data/hash.c
+++ b/src/data/hash.c
@@ -68,7 +68,7 @@ hash_insert_ht(Hash *p_hash, char *c_key, void *p_val, TYPE type) {
if (p_hash->i_cur_size == p_hash->i_size)
hash_size(p_hash, p_hash->i_size *2);
- int i_addr = hash_getaddr(p_hash, c_key, free_ADDR);
+ int i_addr = hash_getaddr(p_hash, c_key, FREE_ADDR);
if (i_addr == RET_ERROR )
return (RET_NO_SPACE);
@@ -144,7 +144,7 @@ hash_getaddr(Hash *p_hash, char *c_key, HASH_OP OP) {
i_addr = (i_addr *p_hash->i_size + (int) c_key[i]) % p_hash->i_size;
switch (OP) {
- case free_ADDR:
+ case FREE_ADDR:
if (!hash_addrisfree(p_hash,i_addr))
return (i_addr);
break;
@@ -188,7 +188,7 @@ hash_nextaddr(Hash *p_hash, int i_max_tries, char *c_key, int i_addr,
i_addr = (i_addr + 1) % p_hash->i_size;
switch (OP) {
- case free_ADDR:
+ case FREE_ADDR:
if (!hash_addrisfree(p_hash,i_addr))
return (i_addr);
break;
@@ -289,3 +289,10 @@ hash_iterate(Hash *p_hash, void (*func)(void *)) {
if (p_hash->p_elems[i].flag == 'o')
(*func) (p_hash->p_elems[i].p_val);
}
+
+void
+hash_iterate_key(Hash *p_hash, void (*func)(void *, char *)) {
+ for (int i = 0; i < p_hash->i_size; ++i)
+ if (p_hash->p_elems[i].flag == 'o')
+ (*func) (p_hash->p_elems[i].p_val, p_hash->p_elems[i].c_key);
+}
diff --git a/src/data/hash.h b/src/data/hash.h
index e49f3c3..9ee8640 100644
--- a/src/data/hash.h
+++ b/src/data/hash.h
@@ -39,7 +39,7 @@
#include "types.h"
typedef enum HASH_OP_ {
- free_ADDR,
+ FREE_ADDR,
OCC_ADDR
} HASH_OP;
@@ -75,6 +75,7 @@ int hash_nextaddr(Hash *p_hash, int i_max_tries,
char *c_key, int i_addr,
HASH_OP OP);
void hash_iterate(Hash *p_hash, void (*func)(void *));
+void hash_iterate_key(Hash *p_hash, void (*func)(void *, char *));
#define hash_get_cur_size(hash) hash->i_cur_size
#define hash_get_size(hash) hash->i_size
diff --git a/src/data/stack.c b/src/data/stack.c
index 5997c86..e7d5766 100644
--- a/src/data/stack.c
+++ b/src/data/stack.c
@@ -173,6 +173,35 @@ stack_iterate(Stack *p_stack, void (*func)(void *p_void)) {
}
}
+void
+stack_iterate2(Stack *p_stack, void (*func)(void *p_void, void *p_void2),
+ void *p_void_arg) {
+ if (!p_stack)
+ return;
+
+ StackElem *p_elem = p_stack->p_first;
+
+ while (p_elem) {
+ (*func)(p_elem->p_val, p_void_arg);
+ p_elem = p_elem->p_next;
+ }
+}
+
+void
+stack_iterate_level(Stack *p_stack, void (*func)(void *p_void,
+ int i_level)) {
+ if (!p_stack)
+ return;
+
+ StackElem *p_elem = p_stack->p_first;
+
+ int i_level = 0;
+ while (p_elem) {
+ (*func)(p_elem->p_val, i_level++);
+ p_elem = p_elem->p_next;
+ }
+}
+
StackIterator*
stackiterator_new(Stack *p_stack) {
StackIterator *p_iter = malloc(sizeof(StackIterator));
diff --git a/src/data/stack.h b/src/data/stack.h
index 88bde8d..45acdf8 100644
--- a/src/data/stack.h
+++ b/src/data/stack.h
@@ -59,6 +59,10 @@ Stack *stack_new();
StackElem *stackelem_new();
_Bool stack_empty(Stack *p_stack);
void stack_iterate(Stack *p_stack, void (*func)(void *p_void));
+void stack_iterate2(Stack *p_stack, void (*func)(void *p_void, void *p_void2),
+ void *p_void_arg);
+void stack_iterate_level(Stack *p_stack, void (*func)(void *p_void,
+ int i_level));
void stack_push(Stack *p_stack, void *p_val);
void *stack_pop(Stack *p_stack);
void stack_clear(Stack *p_stack);
diff --git a/src/defines.h b/src/defines.h
index 6ff662a..90ed947 100644
--- a/src/defines.h
+++ b/src/defines.h
@@ -75,7 +75,7 @@
exit(1); }
#define DPRINTF(...) printf("DEBUG("); printf(__VA_ARGS__); printf(")\n");
-#define DEBUG_GC
+//#define DEBUG_GC
//#define DEBUG_TOKEN_REFCOUNT
//#define DEBUG_FUNCTION_PROCESS
//#define DEBUG_TRACK