--- stack/stack.c 2002/02/08 05:37:54 1.61 +++ stack/stack.c 2002/02/08 13:01:16 1.63 @@ -955,15 +955,19 @@ a=env->head->item->content.val; toss(env); if(env->err) return; - b=env->head->item->content.val; - toss(env); - if(env->err) return; - push_int(&(env->head), a+b); + if(env->head->item->refcount == 1) + env->head->item->content.val += a; + else { + b=env->head->item->content.val; + toss(env); + if(env->err) return; + push_int(&(env->head), a+b); + } } /* - */ extern void sx_2d(environment *env) { - int a; + int a, b; if((env->head)==NULL || env->head->next==NULL) { printerr("Too Few Arguments"); @@ -980,12 +984,19 @@ a=env->head->item->content.val; toss(env); if(env->err) return; - env->head->item->content.val -= a; + if(env->head->item->refcount == 1) + env->head->item->content.val -= a; + else { + b=env->head->item->content.val; + toss(env); + if(env->err) return; + push_int(&(env->head), b-a); + } } /* > */ extern void sx_3e(environment *env) { - int a; + int a, b; if((env->head)==NULL || env->head->next==NULL) { printerr("Too Few Arguments"); @@ -1002,7 +1013,14 @@ a=env->head->item->content.val; toss(env); if(env->err) return; - env->head->item->content.val = (env->head->item->content.val > a); + if(env->head->item->refcount == 1) + env->head->item->content.val = (env->head->item->content.val > a); + else { + b=env->head->item->content.val; + toss(env); + if(env->err) return; + push_int(&(env->head), b>a); + } } /* Return copy of a value */ @@ -1131,6 +1149,7 @@ extern void sx_7768696c65(environment *env) { int truth; + value *loop, *test; if((env->head)==NULL || env->head->next==NULL) { printerr("Too Few Arguments"); @@ -1138,10 +1157,17 @@ return; } + loop= env->head->item; + loop->refcount++; + toss(env); if(env->err) return; + + test= env->head->item; + test->refcount++; + toss(env); if(env->err) return; + do { - swap(env); if(env->err) return; - dup(env); if(env->err) return; - eval(env); if(env->err) return; + push_val(&(env->head), test); + eval(env); if(env->head->item->type != integer) { printerr("Bad Argument Type"); @@ -1150,17 +1176,17 @@ } truth= env->head->item->content.val; - toss(env); if(env->err) return; - swap(env); if(env->err) return; if(truth) { - dup(env); + push_val(&(env->head), loop); eval(env); } else { toss(env); - toss(env); } } while(truth); + + free_val(test); + free_val(loop); }