--- stack/symbols.c 2003/08/13 11:58:00 1.9 +++ stack/symbols.c 2003/08/18 14:39:16 1.10 @@ -10,14 +10,14 @@ /* Print a newline to a port */ extern void nlport(environment *env) { - if(check_args(env, port, empty)) + if(check_args(env, 1, port)) return printerr(env); - if(fprintf(CAR(env->head)->content.p, "\n") < 0){ - perror("nl"); + if(fprintf(CAR(env->head)->content.p, "\n") < 0) { env->err= 5; - return; + return printerr(env); } + toss(env); } @@ -25,7 +25,7 @@ extern void type(environment *env) { - if(check_args(env, unknown, empty)) + if(check_args(env, 1, unknown)) return printerr(env); switch(CAR(env->head)->type){ @@ -66,7 +66,7 @@ extern void print_(environment *env) { - if(check_args(env, unknown, empty)) + if(check_args(env, 1, unknown)) return printerr(env); print_val(env, CAR(env->head), 0, NULL, stdout); @@ -87,7 +87,7 @@ extern void princ_(environment *env) { - if(check_args(env, unknown, empty)) + if(check_args(env, 1, unknown)) return printerr(env); print_val(env, CAR(env->head), 1, NULL, stdout); @@ -105,7 +105,7 @@ extern void printport_(environment *env) { - if(check_args(env, port, unknown, empty)) + if(check_args(env, 2, port, unknown)) return printerr(env); print_val(env, CAR(CDR(env->head)), 0, NULL, CAR(env->head)->content.p); @@ -125,7 +125,7 @@ extern void princport_(environment *env) { - if(check_args(env, port, unknown, empty)) + if(check_args(env, 2, port, unknown)) return printerr(env); print_val(env, CAR(CDR(env->head)), 1, NULL, CAR(env->head)->content.p); @@ -145,7 +145,7 @@ { value *temp= env->head; - if(check_args(env, unknown, unknown, unknown, empty)) + if(check_args(env, 3, unknown, unknown, unknown)) return printerr(env); env->head= CDR(CDR(env->head)); @@ -158,7 +158,7 @@ { value *temp, *new_head; - if(check_args(env, tcons, empty)) + if(check_args(env, 1, tcons)) return printerr(env); rev(env); @@ -193,7 +193,7 @@ { void *left, *right; - if(check_args(env, unknown, unknown, empty)) + if(check_args(env, 2, unknown, unknown)) return printerr(env); left= CAR(env->head)->content.ptr; @@ -208,7 +208,7 @@ { int val; - if(check_args(env, integer, empty)) + if(check_args(env, 1, integer)) return printerr(env); val= CAR(env->head)->content.i; @@ -229,7 +229,7 @@ symbol *sym; /* Needs two values on the stack, the top one must be a symbol */ - if(check_args(env, symb, unknown, empty)) + if(check_args(env, 2, symb, unknown)) return printerr(env); /* long names are a pain */ @@ -252,7 +252,7 @@ { char* sym_id; - if(check_args(env, symb, empty)) + if(check_args(env, 1, symb)) return printerr(env); sym_id= CAR(env->head)->content.sym->id; @@ -276,10 +276,7 @@ char* new_string; value *a_val, *b_val; - if(check_args(env, unknown, unknown, empty)) - return printerr(env); - - if(check_args(env, string, string, empty)==0) { + if(check_args(env, 2, string, string)==0) { a_val= CAR(env->head); b_val= CAR(CDR(env->head)); protect(a_val); protect(b_val); @@ -297,7 +294,7 @@ return; } - if(check_args(env, integer, integer, empty)==0) { + if(check_args(env, 2, integer, integer)==0) { a= CAR(env->head)->content.i; toss(env); if(env->err) return; b= CAR(env->head)->content.i; @@ -307,7 +304,7 @@ return; } - if(check_args(env, tfloat, tfloat, empty)==0) { + if(check_args(env, 2, tfloat, tfloat)==0) { fa= CAR(env->head)->content.f; toss(env); if(env->err) return; fb= CAR(env->head)->content.f; @@ -317,7 +314,7 @@ return; } - if(check_args(env, tfloat, integer, empty)==0) { + if(check_args(env, 2, tfloat, integer)==0) { fa= CAR(env->head)->content.f; toss(env); if(env->err) return; b= CAR(env->head)->content.i; @@ -327,7 +324,7 @@ return; } - if(check_args(env, integer, tfloat, empty)==0) { + if(check_args(env, 2, integer, tfloat)==0) { a= CAR(env->head)->content.i; toss(env); if(env->err) return; fb= CAR(env->head)->content.f; @@ -346,10 +343,7 @@ int a, b; float fa, fb; - if(check_args(env, unknown, unknown, empty)) - return printerr(env); - - if(check_args(env, integer, integer, empty)==0) { + if(check_args(env, 2, integer, integer)==0) { a= CAR(env->head)->content.i; toss(env); if(env->err) return; b= CAR(env->head)->content.i; @@ -359,7 +353,7 @@ return; } - if(check_args(env, tfloat, tfloat, empty)==0) { + if(check_args(env, 2, tfloat, tfloat)==0) { fa= CAR(env->head)->content.f; toss(env); if(env->err) return; fb= CAR(env->head)->content.f; @@ -369,7 +363,7 @@ return; } - if(check_args(env, tfloat, integer, empty)==0) { + if(check_args(env, 2, tfloat, integer)==0) { fa= CAR(env->head)->content.f; toss(env); if(env->err) return; b= CAR(env->head)->content.i; @@ -379,7 +373,7 @@ return; } - if(check_args(env, integer, tfloat, empty)==0) { + if(check_args(env, 2, integer, tfloat)==0) { a= CAR(env->head)->content.i; toss(env); if(env->err) return; fb= CAR(env->head)->content.f; @@ -398,10 +392,7 @@ int a, b; float fa, fb; - if(check_args(env, unknown, unknown, empty)) - return printerr(env); - - if(check_args(env, integer, integer, empty)==0) { + if(check_args(env, 2, integer, integer)==0) { a= CAR(env->head)->content.i; toss(env); if(env->err) return; b= CAR(env->head)->content.i; @@ -411,7 +402,7 @@ return; } - if(check_args(env, tfloat, tfloat, empty)==0) { + if(check_args(env, 2, tfloat, tfloat)==0) { fa= CAR(env->head)->content.f; toss(env); if(env->err) return; fb= CAR(env->head)->content.f; @@ -421,7 +412,7 @@ return; } - if(check_args(env, tfloat, integer, empty)==0) { + if(check_args(env, 2, tfloat, integer)==0) { fa= CAR(env->head)->content.f; toss(env); if(env->err) return; b= CAR(env->head)->content.i; @@ -431,7 +422,7 @@ return; } - if(check_args(env, integer, tfloat, empty)==0) { + if(check_args(env, 2, integer, tfloat)==0) { a= CAR(env->head)->content.i; toss(env); if(env->err) return; fb= CAR(env->head)->content.f; @@ -468,7 +459,7 @@ /* "dup"; duplicates an item on the stack */ extern void sx_647570(environment *env) { - if(check_args(env, unknown, empty)) + if(check_args(env, 1, unknown)) return printerr(env); push_val(env, copy_val(env, CAR(env->head))); @@ -479,7 +470,7 @@ { int truth; - if(check_args(env, unknown, integer, empty)) + if(check_args(env, 2, unknown, integer)) return printerr(env); swap(env); @@ -501,7 +492,7 @@ { int truth; - if(check_args(env, unknown, unknown, integer, empty)) + if(check_args(env, 3, unknown, unknown, integer)) return printerr(env); rot(env); @@ -526,7 +517,7 @@ extern void sx_656c7365(environment *env) { - if(check_args(env, unknown, symb, unknown, symb, integer, empty)) + if(check_args(env, 5, unknown, symb, unknown, symb, integer)) return printerr(env); /// XXX @@ -546,7 +537,7 @@ extern void then(environment *env) { - if(check_args(env, unknown, symb, integer, empty)) + if(check_args(env, 3, unknown, symb, integer)) return printerr(env); /// XXX @@ -567,7 +558,7 @@ int truth; value *loop, *test; - if(check_args(env, unknown, integer, empty)) + if(check_args(env, 2, unknown, integer)) return printerr(env); loop= CAR(env->head); @@ -611,7 +602,7 @@ value *loop; int foo1, foo2; - if(check_args(env, unknown, integer, integer, empty)) + if(check_args(env, 3, unknown, integer, integer)) return printerr(env); loop= CAR(env->head); @@ -649,7 +640,7 @@ value *loop, *foo; value *iterator; - if(check_args(env, unknown, tcons, empty)) + if(check_args(env, 2, unknown, tcons)) return printerr(env); loop= CAR(env->head); @@ -686,7 +677,7 @@ int ending, start, i; value *iterator, *temp, *end; - if(check_args(env, integer, integer, empty)) + if(check_args(env, 2, integer, integer)) return printerr(env); end= new_val(env); @@ -744,7 +735,7 @@ { FILE *stream; - if(check_args(env, port, empty)) + if(check_args(env, 1, port)) return printerr(env); stream=CAR(env->head)->content.p; @@ -765,7 +756,7 @@ { FILE *stream; - if(check_args(env, port, empty)) + if(check_args(env, 1, port)) return printerr(env); stream=CAR(env->head)->content.p; @@ -780,7 +771,7 @@ { int freq, dur, period, ticks; - if(check_args(env, integer, integer, empty)) + if(check_args(env, 2, integer, integer)) return printerr(env); dur= CAR(env->head)->content.i; @@ -801,9 +792,8 @@ usleep(dur); return; case -1: - perror("beep"); env->err= 5; - return; + return printerr(env); default: abort(); } @@ -815,7 +805,7 @@ { int dur; - if(check_args(env, integer, empty)) + if(check_args(env, 1, integer)) return printerr(env); dur= CAR(env->head)->content.i; @@ -831,10 +821,7 @@ int a, b; float fa, fb; - if(check_args(env, unknown, unknown, empty)) - return printerr(env); - - if(check_args(env, integer, integer, empty)==0) { + if(check_args(env, 2, integer, integer)==0) { a= CAR(env->head)->content.i; toss(env); if(env->err) return; b= CAR(env->head)->content.i; @@ -844,7 +831,7 @@ return; } - if(check_args(env, tfloat, tfloat, empty)==0) { + if(check_args(env, 2, tfloat, tfloat)==0) { fa= CAR(env->head)->content.f; toss(env); if(env->err) return; fb= CAR(env->head)->content.f; @@ -854,7 +841,7 @@ return; } - if(check_args(env, tfloat, integer, empty)==0) { + if(check_args(env, 2, tfloat, integer)==0) { fa= CAR(env->head)->content.f; toss(env); if(env->err) return; b= CAR(env->head)->content.i; @@ -864,7 +851,7 @@ return; } - if(check_args(env, integer, tfloat, empty)==0) { + if(check_args(env, 2, integer, tfloat)==0) { a= CAR(env->head)->content.i; toss(env); if(env->err) return; fb= CAR(env->head)->content.f; @@ -883,10 +870,7 @@ int a, b; float fa, fb; - if(check_args(env, unknown, unknown, empty)) - return printerr(env); - - if(check_args(env, integer, integer, empty)==0) { + if(check_args(env, 2, integer, integer)==0) { a= CAR(env->head)->content.i; toss(env); if(env->err) return; b= CAR(env->head)->content.i; @@ -896,7 +880,7 @@ return; } - if(check_args(env, tfloat, tfloat, empty)==0) { + if(check_args(env, 2, tfloat, tfloat)==0) { fa= CAR(env->head)->content.f; toss(env); if(env->err) return; fb= CAR(env->head)->content.f; @@ -906,7 +890,7 @@ return; } - if(check_args(env, tfloat, integer, empty)==0) { + if(check_args(env, 2, tfloat, integer)==0) { fa= CAR(env->head)->content.f; toss(env); if(env->err) return; b= CAR(env->head)->content.i; @@ -916,7 +900,7 @@ return; } - if(check_args(env, integer, tfloat, empty)==0) { + if(check_args(env, 2, integer, tfloat)==0) { a= CAR(env->head)->content.i; toss(env); if(env->err) return; fb= CAR(env->head)->content.f; @@ -934,10 +918,7 @@ { int a, b; - if(check_args(env, unknown, unknown, empty)) - return printerr(env); - - if(check_args(env, integer, integer, empty)==0) { + if(check_args(env, 2, integer, integer)==0) { a= CAR(env->head)->content.i; toss(env); if(env->err) return; b= CAR(env->head)->content.i; @@ -956,7 +937,7 @@ { int a, b; - if(check_args(env, integer, integer, empty)) + if(check_args(env, 2, integer, integer)) return printerr(env); a= CAR(env->head)->content.i; @@ -970,7 +951,7 @@ extern void setcar(environment *env) { - if(check_args(env, tcons, unknown, empty)) + if(check_args(env, 2, tcons, unknown)) return printerr(env); CAR(CAR(CDR(env->head)))=CAR(env->head); @@ -980,7 +961,7 @@ extern void setcdr(environment *env) { - if(check_args(env, tcons, unknown, empty)) + if(check_args(env, 2, tcons, unknown)) return printerr(env); CDR(CAR(CDR(env->head)))=CAR(env->head); @@ -990,7 +971,7 @@ extern void car(environment *env) { - if(check_args(env, tcons, empty)) + if(check_args(env, 1, tcons)) return printerr(env); CAR(env->head)=CAR(CAR(env->head)); @@ -999,7 +980,7 @@ extern void cdr(environment *env) { - if(check_args(env, tcons, empty)) + if(check_args(env, 1, tcons)) return printerr(env); CAR(env->head)=CDR(CAR(env->head)); @@ -1009,7 +990,7 @@ { value *val; - if(check_args(env, unknown, unknown, empty)) + if(check_args(env, 2, unknown, unknown)) return printerr(env); val=new_val(env); @@ -1038,7 +1019,7 @@ /* Needs two values on the stack, the top one must be an association list */ - if(check_args(env, tcons, unknown, empty)) + if(check_args(env, 2, tcons, unknown)) return printerr(env); key=CAR(CDR(env->head)); @@ -1055,7 +1036,7 @@ eqfunc((void*)env); if(env->err) return; /* Check the result of 'eqfunc' */ - if(check_args(env, integer, empty)) + if(check_args(env, 1, integer)) return printerr(env); if(CAR(env->head)->content.i){ @@ -1107,16 +1088,15 @@ value *new_port; FILE *stream; - if(check_args(env, string, string, empty)) + if(check_args(env, 2, string, string)) return printerr(env); stream=fopen(CAR(CDR(env->head))->content.ptr, CAR(env->head)->content.ptr); if(stream == NULL) { - perror("open"); env->err= 5; - return; + return printerr(env); } new_port=new_val(env); @@ -1137,15 +1117,14 @@ { int ret; - if(check_args(env, port, empty)) + if(check_args(env, 1, port)) return printerr(env); ret= fclose(CAR(env->head)->content.p); if(ret != 0){ - perror("close"); env->err= 5; - return; + return printerr(env); } toss(env); @@ -1156,7 +1135,7 @@ { char *new_string; - if(check_args(env, string, empty)) + if(check_args(env, 1, string)) return printerr(env); new_string= mangle_str(CAR(env->head)->content.string); @@ -1177,7 +1156,7 @@ extern void sx_77616974706964(environment *env) { - if(check_args(env, integer, empty)) + if(check_args(env, 1, integer)) return printerr(env); push_int(env, waitpid(CAR(env->head)->content.i, NULL, 0)); @@ -1189,7 +1168,7 @@ extern void toss(environment *env) { - if(check_args(env, unknown, empty)) + if(check_args(env, 1, unknown)) return printerr(env); env->head= CDR(env->head); /* Remove the top stack item */ @@ -1280,3 +1259,116 @@ { puts(warranty_message); } + + +/* random */ +extern void sx_72616e646f6d(environment *env) +{ + push_int(env, (int)rand()); +} + + +extern void seed(environment *env) +{ + if(check_args(env, 1, integer)) + return printerr(env); + + srand(CAR(env->head)->content.i); + toss(env); +} + + +extern void ticks(environment *env) +{ + int val; + + val= (int)time(NULL); + if(val<0) { + env->err= 5; + return printerr(env); + } + + return push_int(env, val); +} + + +extern void push(environment *env) +{ + symbol *sym; + value *oldval; + value *newval; + + if(check_args(env, 2, symb, unknown)==0) { + sym= CAR(env->head)->content.sym; + oldval= sym->val; + + if(oldval==NULL) + oldval= new_val(env); + + sym->val= new_val(env); + sym->val->content.c= malloc(sizeof(pair)); + assert(sym->val->content.c!=NULL); + env->gc_count += sizeof(pair); + sym->val->type= tcons; + CDR(sym->val)= oldval; + CAR(sym->val)= CAR(CDR(env->head)); + env->head= CDR(CDR(env->head)); + + return; + } + + if(check_args(env, 2, tcons, unknown)==0 + || check_args(env, 2, empty, unknown)==0) { + oldval= CAR(env->head); + env->head= CDR(env->head); + newval= new_val(env); + newval->content.c= malloc(sizeof(pair)); + assert(newval->content.c!=NULL); + env->gc_count += sizeof(pair); + newval->type= tcons; + CDR(newval)= oldval; + CAR(newval)= CAR(env->head); + env->head= CDR(env->head); + push_val(env, newval); + + return; + } + + return printerr(env); +} + + +extern void pop(environment *env) +{ + symbol *sym; + value *val; + + if(check_args(env, 1, symb)==0) { + sym= CAR(env->head)->content.sym; + + if(sym->val==NULL) { + env->err= 3; + return printerr(env); + } + + env->head= CDR(env->head); + if(sym->val->type==tcons) { + push_val(env, CAR(sym->val)); + sym->val= CDR(sym->val); + } else { + env->err= 2; + return printerr(env); + } + + return; + } + + if(check_args(env, 1, tcons)==0) { + val= CAR(env->head); + env->head= CDR(env->head); + push_val(env, CAR(val)); + return; + } + + return printerr(env); +}