--- stack/stack.c 2002/02/06 00:30:14 1.35 +++ stack/stack.c 2002/02/06 01:51:08 1.37 @@ -218,6 +218,7 @@ switch (val->type){ /* and free the contents if necessary */ case string: free(val->content.ptr); + break; case list: /* lists needs to be freed recursively */ item=val->content.ptr; while(item != NULL) { /* for all stack items */ @@ -240,7 +241,7 @@ stackitem *temp= env->head; if((env->head)==NULL) { - printerr("Stack empty"); + printerr("Too Few Arguments"); env->err=1; return; } @@ -256,6 +257,39 @@ printf("\n"); } +/* Gets the type of a value */ +extern void type(environment *env){ + int typenum; + + if((env->head)==NULL) { + printerr("Too Few Arguments"); + env->err=1; + return; + } + typenum=env->head->item->type; + toss(env); + switch(typenum){ + case integer: + push_sym(env, "integer"); + break; + case string: + push_sym(env, "string"); + break; + case symb: + push_sym(env, "symbol"); + break; + case func: + push_sym(env, "function"); + break; + case list: + push_sym(env, "list"); + break; + default: + push_sym(env, "unknown"); + break; + } +} + /* Prints the top element of the stack. */ void print_h(stackitem *stack_head) { @@ -283,7 +317,7 @@ extern void print_(environment *env) { if(env->head==NULL) { - printerr("Stack empty"); + printerr("Too Few Arguments"); env->err=1; return; } @@ -314,8 +348,6 @@ extern void printstack(environment *env) { if(env->head == NULL) { - printerr("Stack empty"); - env->err=1; return; } print_st(env->head, 1); @@ -328,13 +360,13 @@ stackitem *temp= env->head; if((env->head)==NULL) { - printerr("Stack empty"); + printerr("Too Few Arguments"); env->err=1; return; } if(env->head->next==NULL) { - printerr("Not enough arguments"); + printerr("Too Few Arguments"); env->err=1; return; } @@ -360,21 +392,21 @@ value *val; if(env->head == NULL) { - printerr("Stack empty"); + printerr("Too Few Arguments"); env->err=1; return; } if(env->head->item->type!=symb) { - printerr("Not a symbol"); - env->err=1; + printerr("Bad Argument Type"); + env->err=2; return; } val=((symbol *)(env->head->item->content.ptr))->val; if(val == NULL){ - printerr("Unbound variable"); - env->err=1; + printerr("Unbound Variable"); + env->err=3; return; } toss(env); /* toss the symbol */ @@ -389,7 +421,7 @@ { funcp in_func; if(env->head==NULL) { - printerr("Stack empty"); + printerr("Too Few Arguments"); env->err=1; return; } @@ -457,7 +489,7 @@ } /* Parse input. */ -int stack_read(environment *env, char *in_line) +void stack_read(environment *env, char *in_line) { char *temp, *rest; int itemp; @@ -518,18 +550,16 @@ } } while(0); - free(temp); if(convert<2) { free(rest); - return 0; + return; } stack_read(env, rest); free(rest); - return 1; } /* Relocate elements of the list on the stack. */ @@ -538,11 +568,16 @@ stackitem *temp, *new_head; /* Is top element a list? */ - if(env->head==NULL || env->head->item->type!=list) { - printerr("Stack empty or not a list"); + 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; + } /* The first list element is the new stack head */ new_head= temp= env->head->item->content.ptr; @@ -567,7 +602,7 @@ int result; if((env->head)==NULL || env->head->next==NULL) { - printerr("Not enough elements to compare"); + printerr("Too Few Arguments"); env->err=1; return; } @@ -586,12 +621,18 @@ { int val; - if((env->head)==NULL || env->head->item->type!=integer) { - printerr("Stack empty or element is not a integer"); + if((env->head)==NULL) { + printerr("Too Few Arguments"); env->err=1; return; } + if(env->head->item->type!=integer) { + printerr("Bad Argument Type"); + env->err=2; + return; + } + val= env->head->item->content.val; toss(env); push_int(&(env->head), !val); @@ -611,13 +652,18 @@ symbol *sym; /* Needs two values on the stack, the top one must be a symbol */ - if(env->head==NULL || env->head->next==NULL - || env->head->item->type!=symb) { - printerr("Define what?"); + if(env->head==NULL || env->head->next==NULL) { + printerr("Too Few Arguments"); env->err=1; return; } + if(env->head->item->type!=symb) { + printerr("Bad Argument Type"); + env->err=2; + return; + } + /* long names are a pain */ sym=env->head->item->content.ptr; @@ -667,8 +713,15 @@ 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"); + if(stack_head==NULL) { + printerr("Too Few Arguments"); + env->err=1; + return; + } + + if(stack_head->item->type!=symb) { + printerr("Bad Argument Type"); + env->err=2; return; } @@ -684,7 +737,12 @@ } free(temp->id); free(temp); -} +} + +/* Returns the current error number to the stack */ +extern void errn(environment *env){ + push_int(&(env->head), env->err); +} int main() {