--- stack/stack.c 2002/02/05 23:00:42 1.33 +++ stack/stack.c 2002/02/05 23:26:46 1.34 @@ -255,7 +255,7 @@ } /* Print newline. */ -extern void nl(environment *env) +extern void nl() { printf("\n"); } @@ -489,7 +489,7 @@ break; } /* If symbol */ - if((convert= sscanf(in_line, "%[^][ ;\n\r_]%[^\n\r]", temp, rest))) { + if((convert= sscanf(in_line, "%[^][ ;\n\r]%[^\n\r]", temp, rest))) { push_sym(env, temp); break; } @@ -659,6 +659,32 @@ } } +/* Forgets a symbol (remove it from the hash table) */ +extern void forget(environment *env) +{ + char* sym_id; + stackitem *stack_head= env->head; + symbol **hash_entry, *temp; + + if(stack_head==NULL || stack_head->item->type!=symb) { + printerr("Stack empty or not a symbol"); + return; + } + + sym_id= ((symbol*)(stack_head->item->content.ptr))->id; + toss(env); + + hash_entry= hash(env->symbols, sym_id); + temp= *hash_entry; + *hash_entry= (*hash_entry)->next; + + if(temp->val!=NULL) { + free_val(temp->val); + } + free(temp->id); + free(temp); +} + int main() { environment myenv;