--- stack/stack.c 2002/02/06 11:39:20 1.39 +++ stack/stack.c 2002/02/06 23:27:22 1.43 @@ -454,6 +454,33 @@ } } +/* Reverse a list */ +extern void rev(environment *env){ + stackitem *old_head, *new_head, *item; + + if((env->head)==NULL) { + printerr("Too Few Arguments"); + env->err=1; + return; + } + + if(env->head->item->type!=list) { + printerr("Bad Argument Type"); + env->err=2; + return; + } + + old_head=(stackitem *)(env->head->item->content.ptr); + new_head=NULL; + while(old_head != NULL){ + item=old_head; + old_head=old_head->next; + item->next=new_head; + new_head=item; + } + env->head->item->content.ptr=new_head; +} + /* Make a list. */ extern void pack(environment *env) { @@ -494,6 +521,7 @@ temp->item= pack; push(&(env->head), temp); + rev(env); } /* Parse input. */ @@ -509,6 +537,12 @@ rest= malloc(inlength); do { + /* If comment */ + if((convert= sscanf(in_line, "#%[^\n\r]", rest))) { + free(temp); free(rest); + return; + } + /* If string */ if((convert= sscanf(in_line, "\"%[^\"\n\r]\" %[^\n\r]", temp, rest))) { push_cstring(&(env->head), temp); @@ -587,6 +621,11 @@ return; } + rev(env); + + if(env->err) + return; + /* The first list element is the new stack head */ new_head= temp= env->head->item->content.ptr; @@ -603,33 +642,6 @@ } -/* Reverse a list */ -extern void rev(environment *env){ - stackitem *old_head, *new_head, *item; - - if((env->head)==NULL) { - printerr("Too Few Arguments"); - env->err=1; - return; - } - - if(env->head->item->type!=list) { - printerr("Bad Argument Type"); - env->err=2; - return; - } - - old_head=(stackitem *)(env->head->item->content.ptr); - new_head=NULL; - while(old_head != NULL){ - item=old_head; - old_head=old_head->next; - item->next=new_head; - new_head=item; - } - env->head->item->content.ptr=new_head; -} - /* Compares two elements by reference. */ extern void eq(environment *env) { @@ -796,6 +808,6 @@ } printf("okidok\n "); } - - exit(EXIT_SUCCESS); + quit(&myenv); + return EXIT_FAILURE; }