--- stack/stack.c 2002/01/08 12:33:57 1.6 +++ stack/stack.c 2002/01/08 13:46:05 1.7 @@ -11,7 +11,7 @@ typedef struct stack_item { - enum {value, string, ref, func, symbol} type; + enum {value, string, ref, func, symbol, list} type; union { void* ptr; int val; @@ -150,6 +150,12 @@ { stackitem* temp= *stack_head; + if((*stack_head)==NULL) + return; + + if((*stack_head)->type==string) + free((*stack_head)->content.ptr); + *stack_head= (*stack_head)->next; free(temp); } @@ -173,6 +179,7 @@ break; case func: case symbol: + default: printf("%ld: %p\n", counter, stack_head->content.ptr); break; } @@ -259,6 +266,37 @@ toss(stack_head); } +extern void pack(stackitem** stack_head) +{ + void* delimiter; + stackitem *iterator, *temp, *pack; + + if((*stack_head)==NULL) + return; + + delimiter= (*stack_head)->content.ptr; + toss(stack_head); + + iterator= *stack_head; + + while(iterator->next!=NULL && iterator->next->content.ptr!=delimiter) + iterator= iterator->next; + + temp= *stack_head; + *stack_head= iterator->next; + iterator->next= NULL; + + if(*stack_head!=NULL && (*stack_head)->content.ptr==delimiter) + toss(stack_head); + + pack= malloc(sizeof(stackitem)); + pack->type= list; + pack->content.ptr= temp; + + push(stack_head, pack); +} + + extern void nl() { printf("\n");