--- stack/symbols.c 2003/08/04 14:32:27 1.3 +++ stack/symbols.c 2003/08/13 11:58:00 1.9 @@ -1,4 +1,5 @@ #include "stack.h" +#include "messages.h" /* Print newline. */ extern void nl(environment *env) @@ -9,17 +10,8 @@ /* Print a newline to a port */ extern void nlport(environment *env) { - if(env->head->type==empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } - - if(CAR(env->head)->type!=port) { - printerr("Bad Argument Type"); - env->err= 2; - return; - } + if(check_args(env, port, empty)) + return printerr(env); if(fprintf(CAR(env->head)->content.p, "\n") < 0){ perror("nl"); @@ -32,16 +24,17 @@ /* Gets the type of a value */ extern void type(environment *env) { - if(env->head->type==empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } + + if(check_args(env, unknown, empty)) + return printerr(env); switch(CAR(env->head)->type){ case empty: push_sym(env, "empty"); break; + case unknown: + push_sym(env, "unknown"); + break; case integer: push_sym(env, "integer"); break; @@ -72,11 +65,10 @@ /* Print the top element of the stack but don't discard it */ extern void print_(environment *env) { - if(env->head->type==empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } + + if(check_args(env, unknown, empty)) + return printerr(env); + print_val(env, CAR(env->head), 0, NULL, stdout); if(env->err) return; nl(env); @@ -94,11 +86,10 @@ discard it. */ extern void princ_(environment *env) { - if(env->head->type==empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } + + if(check_args(env, unknown, empty)) + return printerr(env); + print_val(env, CAR(env->head), 1, NULL, stdout); } @@ -113,17 +104,9 @@ /* Print a value to a port, but don't discard it */ extern void printport_(environment *env) { - if(env->head->type==empty || CDR(env->head)->type == empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } - if(CAR(env->head)->type!=port) { - printerr("Bad Argument Type"); - env->err= 2; - return; - } + if(check_args(env, port, unknown, empty)) + return printerr(env); print_val(env, CAR(CDR(env->head)), 0, NULL, CAR(env->head)->content.p); if(env->err) return; @@ -141,17 +124,9 @@ /* Print, without quotes, to a port, a value, but don't discard it. */ extern void princport_(environment *env) { - if(env->head->type==empty || CDR(env->head)->type == empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } - if(CAR(env->head)->type!=port) { - printerr("Bad Argument Type"); - env->err= 2; - return; - } + if(check_args(env, port, unknown, empty)) + return printerr(env); print_val(env, CAR(CDR(env->head)), 1, NULL, CAR(env->head)->content.p); toss(env); if(env->err) return; @@ -169,13 +144,9 @@ extern void rot(environment *env) { value *temp= env->head; - - if(env->head->type == empty || CDR(env->head)->type == empty - || CDR(CDR(env->head))->type == empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } + + if(check_args(env, unknown, unknown, unknown, empty)) + return printerr(env); env->head= CDR(CDR(env->head)); CDR(CDR(temp))= CDR(env->head); @@ -187,18 +158,8 @@ { value *temp, *new_head; - /* Is top element a list? */ - if(env->head->type==empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } - - if(CAR(env->head)->type!=tcons) { - printerr("Bad Argument Type"); - env->err= 2; - return; - } + if(check_args(env, tcons, empty)) + return printerr(env); rev(env); @@ -210,14 +171,14 @@ toss(env); + /// XXX /* Find the end of the list */ while(CDR(temp)->type != empty) { if (CDR(temp)->type == tcons) temp= CDR(temp); else { - printerr("Bad Argument Type"); /* Improper list */ - env->err= 2; - return; + env->err= 2; /* Improper list */ + return printerr(env); } } @@ -232,11 +193,8 @@ { void *left, *right; - if(env->head->type==empty || CDR(env->head)->type==empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } + if(check_args(env, unknown, unknown, empty)) + return printerr(env); left= CAR(env->head)->content.ptr; right= CAR(CDR(env->head))->content.ptr; @@ -250,17 +208,8 @@ { int val; - if(env->head->type==empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } - - if(CAR(env->head)->type!=integer) { - printerr("Bad Argument Type"); - env->err= 2; - return; - } + if(check_args(env, integer, empty)) + return printerr(env); val= CAR(env->head)->content.i; toss(env); @@ -280,17 +229,8 @@ symbol *sym; /* Needs two values on the stack, the top one must be a symbol */ - if(env->head->type==empty || CDR(env->head)->type==empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } - - if(CAR(env->head)->type!=symb) { - printerr("Bad Argument Type"); - env->err= 2; - return; - } + if(check_args(env, symb, unknown, empty)) + return printerr(env); /* long names are a pain */ sym= CAR(env->head)->content.sym; @@ -304,8 +244,7 @@ /* Clear stack */ extern void clear(environment *env) { - while(env->head->type != empty) - toss(env); + env->head= new_val(env); } /* Forgets a symbol (remove it from the hash table) */ @@ -313,17 +252,8 @@ { char* sym_id; - if(env->head->type==empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } - - if(CAR(env->head)->type!=symb) { - printerr("Bad Argument Type"); - env->err= 2; - return; - } + if(check_args(env, symb, empty)) + return printerr(env); sym_id= CAR(env->head)->content.sym->id; toss(env); @@ -346,14 +276,10 @@ char* new_string; value *a_val, *b_val; - if(env->head->type==empty || CDR(env->head)->type==empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } + if(check_args(env, unknown, unknown, empty)) + return printerr(env); - if(CAR(env->head)->type==string - && CAR(CDR(env->head))->type==string) { + if(check_args(env, string, string, empty)==0) { a_val= CAR(env->head); b_val= CAR(CDR(env->head)); protect(a_val); protect(b_val); @@ -371,8 +297,7 @@ return; } - if(CAR(env->head)->type==integer - && CAR(CDR(env->head))->type==integer) { + if(check_args(env, integer, integer, empty)==0) { a= CAR(env->head)->content.i; toss(env); if(env->err) return; b= CAR(env->head)->content.i; @@ -382,8 +307,7 @@ return; } - if(CAR(env->head)->type==tfloat - && CAR(CDR(env->head))->type==tfloat) { + if(check_args(env, tfloat, tfloat, empty)==0) { fa= CAR(env->head)->content.f; toss(env); if(env->err) return; fb= CAR(env->head)->content.f; @@ -393,8 +317,7 @@ return; } - if(CAR(env->head)->type==tfloat - && CAR(CDR(env->head))->type==integer) { + if(check_args(env, tfloat, integer, empty)==0) { fa= CAR(env->head)->content.f; toss(env); if(env->err) return; b= CAR(env->head)->content.i; @@ -404,8 +327,7 @@ return; } - if(CAR(env->head)->type==integer - && CAR(CDR(env->head))->type==tfloat) { + if(check_args(env, integer, tfloat, empty)==0) { a= CAR(env->head)->content.i; toss(env); if(env->err) return; fb= CAR(env->head)->content.f; @@ -415,8 +337,7 @@ return; } - printerr("Bad Argument Type"); - env->err=2; + return printerr(env); } /* "-" */ @@ -425,14 +346,10 @@ int a, b; float fa, fb; - if(env->head->type==empty || CDR(env->head)->type==empty) { - printerr("Too Few Arguments"); - env->err=1; - return; - } - - if(CAR(env->head)->type==integer - && CAR(CDR(env->head))->type==integer) { + if(check_args(env, unknown, unknown, empty)) + return printerr(env); + + if(check_args(env, integer, integer, empty)==0) { a= CAR(env->head)->content.i; toss(env); if(env->err) return; b= CAR(env->head)->content.i; @@ -442,8 +359,7 @@ return; } - if(CAR(env->head)->type==tfloat - && CAR(CDR(env->head))->type==tfloat) { + if(check_args(env, tfloat, tfloat, empty)==0) { fa= CAR(env->head)->content.f; toss(env); if(env->err) return; fb= CAR(env->head)->content.f; @@ -453,8 +369,7 @@ return; } - if(CAR(env->head)->type==tfloat - && CAR(CDR(env->head))->type==integer) { + if(check_args(env, tfloat, integer, empty)==0) { fa= CAR(env->head)->content.f; toss(env); if(env->err) return; b= CAR(env->head)->content.i; @@ -464,8 +379,7 @@ return; } - if(CAR(env->head)->type==integer - && CAR(CDR(env->head))->type==tfloat) { + if(check_args(env, integer, tfloat, empty)==0) { a= CAR(env->head)->content.i; toss(env); if(env->err) return; fb= CAR(env->head)->content.f; @@ -475,8 +389,7 @@ return; } - printerr("Bad Argument Type"); - env->err=2; + return printerr(env); } /* ">" */ @@ -485,14 +398,10 @@ int a, b; float fa, fb; - if(env->head->type==empty || CDR(env->head)->type==empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } - - if(CAR(env->head)->type==integer - && CAR(CDR(env->head))->type==integer) { + if(check_args(env, unknown, unknown, empty)) + return printerr(env); + + if(check_args(env, integer, integer, empty)==0) { a= CAR(env->head)->content.i; toss(env); if(env->err) return; b= CAR(env->head)->content.i; @@ -502,8 +411,7 @@ return; } - if(CAR(env->head)->type==tfloat - && CAR(CDR(env->head))->type==tfloat) { + if(check_args(env, tfloat, tfloat, empty)==0) { fa= CAR(env->head)->content.f; toss(env); if(env->err) return; fb= CAR(env->head)->content.f; @@ -513,8 +421,7 @@ return; } - if(CAR(env->head)->type==tfloat - && CAR(CDR(env->head))->type==integer) { + if(check_args(env, tfloat, integer, empty)==0) { fa= CAR(env->head)->content.f; toss(env); if(env->err) return; b= CAR(env->head)->content.i; @@ -524,8 +431,7 @@ return; } - if(CAR(env->head)->type==integer - && CAR(CDR(env->head))->type==tfloat) { + if(check_args(env, integer, tfloat, empty)==0) { a= CAR(env->head)->content.i; toss(env); if(env->err) return; fb= CAR(env->head)->content.f; @@ -535,8 +441,7 @@ return; } - printerr("Bad Argument Type"); - env->err= 2; + return printerr(env); } /* "<" */ @@ -563,11 +468,9 @@ /* "dup"; duplicates an item on the stack */ extern void sx_647570(environment *env) { - if(env->head->type==empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } + if(check_args(env, unknown, empty)) + return printerr(env); + push_val(env, copy_val(env, CAR(env->head))); } @@ -576,18 +479,9 @@ { int truth; - if(env->head->type==empty || CDR(env->head)->type==empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } + if(check_args(env, unknown, integer, empty)) + return printerr(env); - if(CAR(CDR(env->head))->type != integer) { - printerr("Bad Argument Type"); - env->err= 2; - return; - } - swap(env); if(env->err) return; @@ -607,19 +501,9 @@ { int truth; - if(env->head->type==empty || CDR(env->head)->type==empty - || CDR(CDR(env->head))->type==empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } + if(check_args(env, unknown, unknown, integer, empty)) + return printerr(env); - if(CAR(CDR(CDR(env->head)))->type!=integer) { - printerr("Bad Argument Type"); - env->err= 2; - return; - } - rot(env); if(env->err) return; @@ -641,21 +525,18 @@ /* "else" */ extern void sx_656c7365(environment *env) { - if(env->head->type==empty || CDR(env->head)->type==empty - || CDR(CDR(env->head))->type==empty || CDR(CDR(CDR(env->head)))->type==empty - || CDR(CDR(CDR(CDR(env->head))))->type==empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } + + if(check_args(env, unknown, symb, unknown, symb, integer, empty)) + return printerr(env); + + /// XXX if(CAR(CDR(env->head))->type!=symb || strcmp(CAR(CDR(env->head))->content.sym->id, "then")!=0 || CAR(CDR(CDR(CDR(env->head))))->type!=symb || strcmp(CAR(CDR(CDR(CDR(env->head))))->content.sym->id, "if")!=0) { - printerr("Bad Argument Type"); env->err= 2; - return; + return printerr(env); } swap(env); toss(env); rot(env); toss(env); @@ -664,18 +545,16 @@ extern void then(environment *env) { - if(env->head->type==empty || CDR(env->head)->type==empty - || CDR(CDR(env->head))->type==empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } + + if(check_args(env, unknown, symb, integer, empty)) + return printerr(env); + + /// XXX if(CAR(CDR(env->head))->type!=symb || strcmp(CAR(CDR(env->head))->content.sym->id, "if")!=0) { - printerr("Bad Argument Type"); env->err= 2; - return; + return printerr(env); } swap(env); toss(env); @@ -688,11 +567,8 @@ int truth; value *loop, *test; - if(env->head->type==empty || CDR(env->head)->type==empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } + if(check_args(env, unknown, integer, empty)) + return printerr(env); loop= CAR(env->head); protect(loop); @@ -705,11 +581,12 @@ do { push_val(env, test); eval(env); + + /// XXX if(CAR(env->head)->type != integer) { - printerr("Bad Argument Type"); env->err= 2; - return; + return printerr(env); } truth= CAR(env->head)->content.i; @@ -734,19 +611,8 @@ value *loop; int foo1, foo2; - if(env->head->type==empty || CDR(env->head)->type==empty - || CDR(CDR(env->head))->type==empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } - - if(CAR(CDR(env->head))->type!=integer - || CAR(CDR(CDR(env->head)))->type!=integer) { - printerr("Bad Argument Type"); - env->err= 2; - return; - } + if(check_args(env, unknown, integer, integer, empty)) + return printerr(env); loop= CAR(env->head); protect(loop); @@ -782,19 +648,10 @@ { value *loop, *foo; value *iterator; - - if(env->head->type==empty || CDR(env->head)->type==empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } - - if(CAR(CDR(env->head))->type!=tcons) { - printerr("Bad Argument Type"); - env->err= 2; - return; - } + if(check_args(env, unknown, tcons, empty)) + return printerr(env); + loop= CAR(env->head); protect(loop); toss(env); if(env->err) return; @@ -809,15 +666,18 @@ push_val(env, CAR(iterator)); push_val(env, loop); eval(env); if(env->err) return; + + /// XXX if (iterator->type == tcons){ iterator= CDR(iterator); } else { - printerr("Bad Argument Type"); /* Improper list */ - env->err= 2; + env->err= 2; /* Improper list */ break; } } unprotect(loop); unprotect(foo); + + return printerr(env); } /* "to" */ @@ -826,20 +686,10 @@ int ending, start, i; value *iterator, *temp, *end; - end= new_val(env); - - if(env->head->type==empty || CDR(env->head)->type==empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } + if(check_args(env, integer, integer, empty)) + return printerr(env); - if(CAR(env->head)->type!=integer - || CAR(CDR(env->head))->type!=integer) { - printerr("Bad Argument Type"); - env->err= 2; - return; - } + end= new_val(env); ending= CAR(env->head)->content.i; toss(env); if(env->err) return; @@ -894,17 +744,8 @@ { FILE *stream; - if(env->head->type==empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } - - if(CAR(env->head)->type!=port) { - printerr("Bad Argument Type"); - env->err= 2; - return; - } + if(check_args(env, port, empty)) + return printerr(env); stream=CAR(env->head)->content.p; readlinestream(env, stream); if(env->err) return; @@ -924,17 +765,8 @@ { FILE *stream; - if(env->head->type==empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } - - if(CAR(env->head)->type!=port) { - printerr("Bad Argument Type"); - env->err= 2; - return; - } + if(check_args(env, port, empty)) + return printerr(env); stream=CAR(env->head)->content.p; readstream(env, stream); if(env->err) return; @@ -948,18 +780,8 @@ { int freq, dur, period, ticks; - if(env->head->type==empty || CDR(env->head)->type==empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } - - if(CAR(env->head)->type!=integer - || CAR(CDR(env->head))->type!=integer) { - printerr("Bad Argument Type"); - env->err= 2; - return; - } + if(check_args(env, integer, integer, empty)) + return printerr(env); dur= CAR(env->head)->content.i; toss(env); @@ -993,17 +815,8 @@ { int dur; - if(env->head->type==empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } - - if(CAR(env->head)->type!=integer) { - printerr("Bad Argument Type"); - env->err= 2; - return; - } + if(check_args(env, integer, empty)) + return printerr(env); dur= CAR(env->head)->content.i; toss(env); @@ -1011,20 +824,17 @@ usleep(dur); } + /* "*" */ extern void sx_2a(environment *env) { int a, b; float fa, fb; - if(env->head->type==empty || CDR(env->head)->type==empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } - - if(CAR(env->head)->type==integer - && CAR(CDR(env->head))->type==integer) { + if(check_args(env, unknown, unknown, empty)) + return printerr(env); + + if(check_args(env, integer, integer, empty)==0) { a= CAR(env->head)->content.i; toss(env); if(env->err) return; b= CAR(env->head)->content.i; @@ -1034,8 +844,7 @@ return; } - if(CAR(env->head)->type==tfloat - && CAR(CDR(env->head))->type==tfloat) { + if(check_args(env, tfloat, tfloat, empty)==0) { fa= CAR(env->head)->content.f; toss(env); if(env->err) return; fb= CAR(env->head)->content.f; @@ -1045,8 +854,7 @@ return; } - if(CAR(env->head)->type==tfloat - && CAR(CDR(env->head))->type==integer) { + if(check_args(env, tfloat, integer, empty)==0) { fa= CAR(env->head)->content.f; toss(env); if(env->err) return; b= CAR(env->head)->content.i; @@ -1056,8 +864,7 @@ return; } - if(CAR(env->head)->type==integer - && CAR(CDR(env->head))->type==tfloat) { + if(check_args(env, integer, tfloat, empty)==0) { a= CAR(env->head)->content.i; toss(env); if(env->err) return; fb= CAR(env->head)->content.f; @@ -1067,8 +874,7 @@ return; } - printerr("Bad Argument Type"); - env->err= 2; + return printerr(env); } /* "/" */ @@ -1077,14 +883,10 @@ int a, b; float fa, fb; - if(env->head->type==empty || CDR(env->head)->type==empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } - - if(CAR(env->head)->type==integer - && CAR(CDR(env->head))->type==integer) { + if(check_args(env, unknown, unknown, empty)) + return printerr(env); + + if(check_args(env, integer, integer, empty)==0) { a= CAR(env->head)->content.i; toss(env); if(env->err) return; b= CAR(env->head)->content.i; @@ -1094,8 +896,7 @@ return; } - if(CAR(env->head)->type==tfloat - && CAR(CDR(env->head))->type==tfloat) { + if(check_args(env, tfloat, tfloat, empty)==0) { fa= CAR(env->head)->content.f; toss(env); if(env->err) return; fb= CAR(env->head)->content.f; @@ -1105,8 +906,7 @@ return; } - if(CAR(env->head)->type==tfloat - && CAR(CDR(env->head))->type==integer) { + if(check_args(env, tfloat, integer, empty)==0) { fa= CAR(env->head)->content.f; toss(env); if(env->err) return; b= CAR(env->head)->content.i; @@ -1116,8 +916,7 @@ return; } - if(CAR(env->head)->type==integer - && CAR(CDR(env->head))->type==tfloat) { + if(check_args(env, integer, tfloat, empty)==0) { a= CAR(env->head)->content.i; toss(env); if(env->err) return; fb= CAR(env->head)->content.f; @@ -1127,8 +926,7 @@ return; } - printerr("Bad Argument Type"); - env->err= 2; + return printerr(env); } /* "mod" */ @@ -1136,14 +934,10 @@ { int a, b; - if(env->head->type==empty || CDR(env->head)->type==empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } - - if(CAR(env->head)->type==integer - && CAR(CDR(env->head))->type==integer) { + if(check_args(env, unknown, unknown, empty)) + return printerr(env); + + if(check_args(env, integer, integer, empty)==0) { a= CAR(env->head)->content.i; toss(env); if(env->err) return; b= CAR(env->head)->content.i; @@ -1153,49 +947,31 @@ return; } - printerr("Bad Argument Type"); - env->err= 2; + return printerr(env); } + /* "div" */ extern void sx_646976(environment *env) { int a, b; - - if(env->head->type==empty || CDR(env->head)->type==empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } - if(CAR(env->head)->type==integer - && CAR(CDR(env->head))->type==integer) { - a= CAR(env->head)->content.i; - toss(env); if(env->err) return; - b= CAR(env->head)->content.i; - toss(env); if(env->err) return; - push_int(env, (int)b/a); - - return; - } - - printerr("Bad Argument Type"); - env->err= 2; + if(check_args(env, integer, integer, empty)) + return printerr(env); + + a= CAR(env->head)->content.i; + toss(env); if(env->err) return; + b= CAR(env->head)->content.i; + toss(env); if(env->err) return; + push_int(env, (int)b/a); } + extern void setcar(environment *env) { - if(env->head->type==empty || CDR(env->head)->type==empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } - if(CDR(env->head)->type!=tcons) { - printerr("Bad Argument Type"); - env->err= 2; - return; - } + if(check_args(env, tcons, unknown, empty)) + return printerr(env); CAR(CAR(CDR(env->head)))=CAR(env->head); toss(env); @@ -1203,17 +979,9 @@ extern void setcdr(environment *env) { - if(env->head->type==empty || CDR(env->head)->type==empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } - if(CDR(env->head)->type!=tcons) { - printerr("Bad Argument Type"); - env->err= 2; - return; - } + if(check_args(env, tcons, unknown, empty)) + return printerr(env); CDR(CAR(CDR(env->head)))=CAR(env->head); toss(env); @@ -1221,34 +989,18 @@ extern void car(environment *env) { - if(env->head->type==empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } - if(CAR(env->head)->type!=tcons) { - printerr("Bad Argument Type"); - env->err= 2; - return; - } + if(check_args(env, tcons, empty)) + return printerr(env); CAR(env->head)=CAR(CAR(env->head)); } extern void cdr(environment *env) { - if(env->head->type==empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } - if(CAR(env->head)->type!=tcons) { - printerr("Bad Argument Type"); - env->err= 2; - return; - } + if(check_args(env, tcons, empty)) + return printerr(env); CAR(env->head)=CDR(CAR(env->head)); } @@ -1257,11 +1009,8 @@ { value *val; - if(env->head->type==empty || CDR(env->head)->type==empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } + if(check_args(env, unknown, unknown, empty)) + return printerr(env); val=new_val(env); val->content.c= malloc(sizeof(pair)); @@ -1278,7 +1027,7 @@ swap(env); if(env->err) return; toss(env); if(env->err) return; swap(env); if(env->err) return; - toss(env); if(env->err) return; + toss(env); } @@ -1289,42 +1038,25 @@ /* Needs two values on the stack, the top one must be an association list */ - if(env->head->type==empty || CDR(env->head)->type==empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } - - if(CAR(env->head)->type!=tcons) { - printerr("Bad Argument Type"); - env->err= 2; - return; - } + if(check_args(env, tcons, unknown, empty)) + return printerr(env); key=CAR(CDR(env->head)); item=CAR(env->head); while(item->type == tcons){ if(CAR(item)->type != tcons){ - printerr("Bad Argument Type"); env->err= 2; - return; + return printerr(env); } + push_val(env, key); push_val(env, CAR(CAR(item))); - eqfunc(env); if(env->err) return; + eqfunc((void*)env); if(env->err) return; /* Check the result of 'eqfunc' */ - if(env->head->type==empty) { - printerr("Too Few Arguments"); - env->err= 1; - return; - } - if(CAR(env->head)->type!=integer) { - printerr("Bad Argument Type"); - env->err= 2; - return; - } + if(check_args(env, integer, empty)) + return printerr(env); if(CAR(env->head)->content.i){ toss(env); if(env->err) return; @@ -1333,9 +1065,8 @@ toss(env); if(env->err) return; if(item->type!=tcons) { - printerr("Bad Argument Type"); env->err= 2; - return; + return printerr(env); } item=CDR(item); @@ -1357,7 +1088,7 @@ /* 1: [ [ 1 . 2 ] [ 3 . 4 ] ] => 1: [ 3 . 4 ] */ extern void assq(environment *env) { - assocgen(env, eq); + assocgen(env, (void*)eq); } @@ -1376,18 +1107,8 @@ value *new_port; FILE *stream; - if(env->head->type == empty || CDR(env->head)->type == empty) { - printerr("Too Few Arguments"); - env->err=1; - return; - } - - if(CAR(env->head)->type != string - || CAR(CDR(env->head))->type != string) { - printerr("Bad Argument Type"); - env->err= 2; - return; - } + if(check_args(env, string, string, empty)) + return printerr(env); stream=fopen(CAR(CDR(env->head))->content.ptr, CAR(env->head)->content.ptr); @@ -1416,17 +1137,8 @@ { int ret; - if(env->head->type == empty) { - printerr("Too Few Arguments"); - env->err=1; - return; - } - - if(CAR(env->head)->type != port) { - printerr("Bad Argument Type"); - env->err= 2; - return; - } + if(check_args(env, port, empty)) + return printerr(env); ret= fclose(CAR(env->head)->content.p); @@ -1438,3 +1150,133 @@ toss(env); } + + +extern void mangle(environment *env) +{ + char *new_string; + + if(check_args(env, string, empty)) + return printerr(env); + + new_string= mangle_str(CAR(env->head)->content.string); + + toss(env); + if(env->err) return; + + push_cstring(env, new_string); +} + +/* "fork" */ +extern void sx_666f726b(environment *env) +{ + push_int(env, fork()); +} + +/* "waitpid" */ +extern void sx_77616974706964(environment *env) +{ + + if(check_args(env, integer, empty)) + return printerr(env); + + push_int(env, waitpid(CAR(env->head)->content.i, NULL, 0)); + swap(env); toss(env); +} + + +/* Discard the top element of the stack. */ +extern void toss(environment *env) +{ + + if(check_args(env, unknown, empty)) + return printerr(env); + + env->head= CDR(env->head); /* Remove the top stack item */ +} + + +/* Quit stack. */ +extern void quit(environment *env) +{ + int i; + + env->head= new_val(env); + + if (env->err) return; + for(i= 0; isymbols[i]!= NULL) { + forget_sym(&(env->symbols[i])); + } + env->symbols[i]= NULL; + } + + env->gc_limit= 0; + gc_maybe(env); + + words(env); + + if(env->free_string!=NULL) + free(env->free_string); + +#ifdef __linux__ + muntrace(); +#endif + + exit(EXIT_SUCCESS); +} + + +/* List all defined words */ +extern void words(environment *env) +{ + symbol *temp; + int i; + + for(i= 0; isymbols[i]; + while(temp!=NULL) { +#ifdef DEBUG + if (temp->val != NULL && temp->val->gc.flag.protect) + printf("(protected) "); +#endif /* DEBUG */ + printf("%s ", temp->id); + temp= temp->next; + } + } +} + + +/* Only to be called by itself function printstack. */ +void print_st(environment *env, value *stack_head, long counter) +{ + if(CDR(stack_head)->type != empty) + print_st(env, CDR(stack_head), counter+1); + printf("%ld: ", counter); + print_val(env, CAR(stack_head), 0, NULL, stdout); + printf("\n"); +} + + +/* Prints the stack. */ +extern void printstack(environment *env) +{ + if(env->head->type == empty) { + printf("Stack Empty\n"); + return; + } + + print_st(env, env->head, 1); +} + + +extern void copying(environment *env) +{ + puts(license_message); +} + + +extern void warranty(environment *env) +{ + puts(warranty_message); +}