diff options
| author | Paul Buetow <paul@buetow.org> | 2008-10-26 12:51:57 +0000 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2008-10-26 12:51:57 +0000 |
| commit | a1c3f47491b98cd9026f8e853cc9e72630805c12 (patch) | |
| tree | ec2ea29640b43f2c1f820fd3fee317beec27d130 /src | |
| parent | 380eacd0f4037ec00f37ad5b5e4baa18301cf3dd (diff) | |
added the "scope" function
Diffstat (limited to 'src')
| -rw-r--r-- | src/build.h | 2 | ||||
| -rw-r--r-- | src/core/function.c | 7 | ||||
| -rw-r--r-- | src/core/scope.c | 17 | ||||
| -rw-r--r-- | src/core/scope.h | 1 | ||||
| -rw-r--r-- | src/core/symbol.c | 46 | ||||
| -rw-r--r-- | src/core/symbol.h | 3 | ||||
| -rw-r--r-- | src/data/hash.c | 13 | ||||
| -rw-r--r-- | src/data/hash.h | 3 | ||||
| -rw-r--r-- | src/data/stack.c | 29 | ||||
| -rw-r--r-- | src/data/stack.h | 4 | ||||
| -rw-r--r-- | src/defines.h | 2 |
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 |
