531 |
|
|
532 |
/* Reverse (flip) a list */ |
/* Reverse (flip) a list */ |
533 |
extern void rev(environment *env){ |
extern void rev(environment *env){ |
534 |
stackitem *old_head, *new_head, *item; |
stackitem *item, *temp, *prev= NULL; |
535 |
|
|
536 |
if((env->head)==NULL) { |
if((env->head)==NULL) { |
537 |
printerr("Too Few Arguments"); |
printerr("Too Few Arguments"); |
545 |
return; |
return; |
546 |
} |
} |
547 |
|
|
548 |
old_head=(stackitem *)(env->head->item->content.ptr); |
item= (stackitem *)(env->head->item->content.ptr); |
549 |
new_head=NULL; |
while(item->next!=NULL){ |
550 |
while(old_head != NULL){ |
temp= item->next; |
551 |
item=old_head; |
item->next= prev; |
552 |
old_head=old_head->next; |
prev= item; |
553 |
item->next=new_head; |
item= temp; |
|
new_head=item; |
|
554 |
} |
} |
555 |
env->head->item->content.ptr=new_head; |
item->next= prev; |
556 |
|
|
557 |
|
env->head->item->content.ptr=item; |
558 |
} |
} |
559 |
|
|
560 |
/* Make a list. */ |
/* Make a list. */ |
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 */ |