--- stack/stack.c 2003/08/13 06:12:26 1.134 +++ stack/stack.c 2003/08/13 11:58:00 1.135 @@ -23,7 +23,7 @@ #include "stack.h" -const char* start_message= "Stack version $Revision: 1.134 $\n\ +const char* start_message= "Stack version $Revision: 1.135 $\n\ Copyright (C) 2002 Mats Alritzson and Teddy Hogeborn\n\ Stack comes with ABSOLUTELY NO WARRANTY; for details type 'warranty;'.\n\ This is free software, and you are welcome to redistribute it\n\ @@ -50,8 +50,27 @@ } -void printerr(environment *env, const char* in_string) +void printerr(environment *env) { + char *in_string; + + switch(env->err) { + case 0: + return; + case 1: + in_string= "Too Few Arguments"; + break; + case 2: + in_string= "Bad Argument Type"; + break; + case 3: + in_string= "Unbound Variable"; + break; + default: + in_string= "Unknown error"; + break; + } + fprintf(stderr, "\"%s\":\nErr: %s\n", env->errsymb, in_string); } @@ -586,16 +605,8 @@ { value *temp= env->head; - switch(check_args(env, unknown, unknown, empty)) { - case 1: - printerr(env, "Too Few Arguments"); - return; - case 2: - printerr(env, "Bad Argument Type"); - return; - default: - break; - } + if(check_args(env, unknown, unknown, empty)) + return printerr(env); env->head= CDR(env->head); CDR(temp)= CDR(env->head); @@ -608,23 +619,15 @@ { value *val; - switch(check_args(env, symb, empty)) { - case 1: - printerr(env, "Too Few Arguments"); - return; - case 2: - printerr(env, "Bad Argument Type"); - return; - default: - break; - } + if(check_args(env, symb, empty)) + return printerr(env); val= CAR(env->head)->content.sym->val; if(val == NULL){ - printerr(env, "Unbound Variable"); env->err= 3; - return; + return printerr(env); } + push_val(env, val); /* Return the symbol's bound value */ swap(env); if(env->err) return; @@ -645,16 +648,8 @@ gc_maybe(env); - switch(check_args(env, unknown, empty)) { - case 1: - printerr(env, "Too Few Arguments"); - return; - case 2: - printerr(env, "Bad Argument Type"); - return; - default: - break; - } + if(check_args(env, unknown, empty)) + return printerr(env); switch(CAR(env->head)->type) { /* if it's a symbol */ @@ -671,7 +666,7 @@ case func: in_func= CAR(env->head)->content.func; env->head= CDR(env->head); - return in_func(env); + return in_func((void*)env); /* If it's a list */ case tcons: @@ -697,9 +692,8 @@ if (CDR(iterator)->type == empty || CDR(iterator)->type == tcons) iterator= CDR(iterator); else { - printerr(env, "Bad Argument Type"); /* Improper list */ - env->err= 2; - return; + env->err= 2; /* Improper list */ + return printerr(env); } } unprotect(temp_val); @@ -866,16 +860,8 @@ if(CAR(env->head)->type==empty) return; /* Don't reverse an empty list */ - switch(check_args(env, tcons, empty)) { - case 1: - printerr(env, "Too Few Arguments"); - return; - case 2: - printerr(env, "Bad Argument Type"); - return; - default: - break; - } + if(check_args(env, tcons, empty)) + return printerr(env); old_head= CAR(env->head); new_head= new_val(env);