717 |
toss(env); toss(env); |
toss(env); toss(env); |
718 |
} |
} |
719 |
|
|
720 |
|
extern void clear(environment *); |
721 |
|
void forget_sym(symbol **); |
722 |
|
|
723 |
/* Quit stack. */ |
/* Quit stack. */ |
724 |
extern void quit(environment *env) |
extern void quit(environment *env) |
725 |
{ |
{ |
726 |
|
long i; |
727 |
|
|
728 |
|
clear(env); |
729 |
|
if (env->err) return; |
730 |
|
for(i= 0; i<HASHTBLSIZE; i++) { |
731 |
|
if (env->symbols[i]!= NULL) { |
732 |
|
forget_sym(&(env->symbols[i])); |
733 |
|
env->symbols[i]= NULL; |
734 |
|
} |
735 |
|
} |
736 |
exit(EXIT_SUCCESS); |
exit(EXIT_SUCCESS); |
737 |
} |
} |
738 |
|
|
758 |
} |
} |
759 |
} |
} |
760 |
|
|
761 |
|
/* Internal forget function */ |
762 |
|
void forget_sym(symbol **hash_entry) { |
763 |
|
symbol *temp; |
764 |
|
|
765 |
|
temp= *hash_entry; |
766 |
|
*hash_entry= (*hash_entry)->next; |
767 |
|
|
768 |
|
if(temp->val!=NULL) { |
769 |
|
free_val(temp->val); |
770 |
|
} |
771 |
|
free(temp->id); |
772 |
|
free(temp); |
773 |
|
} |
774 |
|
|
775 |
/* Forgets a symbol (remove it from the hash table) */ |
/* Forgets a symbol (remove it from the hash table) */ |
776 |
extern void forget(environment *env) |
extern void forget(environment *env) |
777 |
{ |
{ |
778 |
char* sym_id; |
char* sym_id; |
779 |
stackitem *stack_head= env->head; |
stackitem *stack_head= env->head; |
|
symbol **hash_entry, *temp; |
|
780 |
|
|
781 |
if(stack_head==NULL) { |
if(stack_head==NULL) { |
782 |
printerr("Too Few Arguments"); |
printerr("Too Few Arguments"); |
793 |
sym_id= ((symbol*)(stack_head->item->content.ptr))->id; |
sym_id= ((symbol*)(stack_head->item->content.ptr))->id; |
794 |
toss(env); |
toss(env); |
795 |
|
|
796 |
hash_entry= hash(env->symbols, sym_id); |
return forget_sym(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); |
|
797 |
} |
} |
798 |
|
|
799 |
/* Returns the current error number to the stack */ |
/* Returns the current error number to the stack */ |