--- stack/stack.c 2002/01/07 23:09:01 1.1.1.1 +++ stack/stack.c 2002/01/07 23:35:37 1.4 @@ -4,13 +4,14 @@ #include /* NULL */ #include +/* dlopen, dlsym, dlerror */ #include #define HASHTBLSIZE 65536 typedef struct stack_item { - enum {value, string, ref, func} type; + enum {value, string, ref, func, symbol} type; union { void* ptr; int val; @@ -109,6 +110,15 @@ mk_hashentry(in_hashtbl, temp, id); } +void def_sym(hashtbl in_hashtbl, const char* id) +{ + stackitem* temp= malloc(sizeof(stackitem)); + + temp->type= symbol; + + mk_hashentry(in_hashtbl, temp, id); +} + int push_ref(stackitem** stack_head, hashtbl in_hash, const char* in_string) { void* handle; @@ -121,11 +131,13 @@ if(new_item->content.ptr==NULL) { handle= dlopen(NULL, RTLD_LAZY); symbol= dlsym(handle, in_string); - if(dlerror()==NULL) { + if(dlerror()==NULL) def_func(in_hash, symbol, in_string); - new_item->content.ptr= *hash(in_hash, in_string); - new_item->type= ref; - } + else + def_sym(in_hash, in_string); + + new_item->content.ptr= *hash(in_hash, in_string); + new_item->type= ref; } push(stack_head, new_item); @@ -147,12 +159,19 @@ if(stack_head->next != NULL) print_st(stack_head->next, counter+1); - if(stack_head->type==value) + switch(stack_head->type){ + case value: printf("%ld: %d\n", counter, (int)stack_head->content.val); - else if(stack_head->type==string) + break; + case string: printf("%ld: \"%s\"\n", counter, (char*)stack_head->content.ptr); - else + break; + case ref: + case func: + case symbol: printf("%ld: %p\n", counter, stack_head->content.ptr); + break; + } } extern void printstack(stackitem** stack_head) @@ -250,3 +269,7 @@ return EXIT_SUCCESS; } + +/* Local Variables: */ +/* compile-command:"make CFLAGS=\"-Wall -g -rdynamic -ldl\" stack" */ +/* End: */