37 |
#include <unistd.h> |
#include <unistd.h> |
38 |
/* EX_NOINPUT, EX_USAGE */ |
/* EX_NOINPUT, EX_USAGE */ |
39 |
#include <sysexits.h> |
#include <sysexits.h> |
40 |
|
/* assert */ |
41 |
|
#include <assert.h> |
42 |
|
|
43 |
#ifdef __linux__ |
#ifdef __linux__ |
44 |
/* mtrace, muntrace */ |
/* mtrace, muntrace */ |
123 |
stackitem *nitem= malloc(sizeof(stackitem)); |
stackitem *nitem= malloc(sizeof(stackitem)); |
124 |
|
|
125 |
nval->content.ptr= NULL; |
nval->content.ptr= NULL; |
126 |
|
nval->type= integer; |
127 |
|
|
128 |
nitem->item= nval; |
nitem->item= nval; |
129 |
nitem->next= env->gc_ref; |
nitem->next= env->gc_ref; |
261 |
value *new_value= new_val(env); |
value *new_value= new_val(env); |
262 |
|
|
263 |
new_value->content.c= malloc(sizeof(cons)); |
new_value->content.c= malloc(sizeof(cons)); |
264 |
|
assert(new_value->content.c!=NULL); |
265 |
new_value->type= tcons; |
new_value->type= tcons; |
266 |
CAR(new_value)= val; |
CAR(new_value)= val; |
267 |
CDR(new_value)= env->head; |
CDR(new_value)= env->head; |
1267 |
|
|
1268 |
protect(old_value); |
protect(old_value); |
1269 |
new_value= new_val(env); |
new_value= new_val(env); |
|
protect(new_value); |
|
1270 |
new_value->type= old_value->type; |
new_value->type= old_value->type; |
1271 |
|
|
1272 |
switch(old_value->type){ |
switch(old_value->type){ |
1281 |
strdup((char *)(old_value->content.ptr)); |
strdup((char *)(old_value->content.ptr)); |
1282 |
break; |
break; |
1283 |
case tcons: |
case tcons: |
|
new_value= NULL; |
|
1284 |
|
|
1285 |
new_value->content.c= malloc(sizeof(cons)); |
new_value->content.c= malloc(sizeof(cons)); |
1286 |
|
assert(new_value->content.c!=NULL); |
1287 |
|
|
1288 |
CAR(new_value)= copy_val(env, CAR(old_value)); /* recurse */ |
CAR(new_value)= copy_val(env, CAR(old_value)); /* recurse */ |
1289 |
CDR(new_value)= copy_val(env, CDR(old_value)); /* recurse */ |
CDR(new_value)= copy_val(env, CDR(old_value)); /* recurse */ |
1290 |
break; |
break; |
1291 |
} |
} |
1292 |
|
|
1293 |
unprotect(old_value); unprotect(new_value); |
unprotect(old_value); |
1294 |
|
|
1295 |
return new_value; |
return new_value; |
1296 |
} |
} |
1376 |
extern void sx_656c7365(environment *env) |
extern void sx_656c7365(environment *env) |
1377 |
{ |
{ |
1378 |
if(env->head==NULL || CDR(env->head)==NULL |
if(env->head==NULL || CDR(env->head)==NULL |
1379 |
|| CDR(CDR(env->head))==NULL || CDR(CDR(CDR(env->head)))==NULL) { |
|| CDR(CDR(env->head))==NULL || CDR(CDR(CDR(env->head)))==NULL |
1380 |
|
|| CDR(CDR(CDR(CDR(env->head))))==NULL) { |
1381 |
|
printerr("Too Few Arguments"); |
1382 |
|
env->err= 1; |
1383 |
|
return; |
1384 |
|
} |
1385 |
|
|
1386 |
|
if(CAR(CDR(env->head))->type!=symb |
1387 |
|
|| strcmp(CAR(CDR(env->head))->content.sym->id, "then")!=0 |
1388 |
|
|| CAR(CDR(CDR(CDR(env->head))))->type!=symb |
1389 |
|
|| strcmp(CAR(CDR(CDR(CDR(env->head))))->content.sym->id, "if")!=0) { |
1390 |
|
printerr("Bad Argument Type"); |
1391 |
|
env->err= 2; |
1392 |
|
return; |
1393 |
|
} |
1394 |
|
|
1395 |
|
swap(env); toss(env); rot(env); toss(env); |
1396 |
|
ifelse(env); |
1397 |
|
} |
1398 |
|
|
1399 |
|
extern void then(environment *env) |
1400 |
|
{ |
1401 |
|
if(env->head==NULL || CDR(env->head)==NULL |
1402 |
|
|| CDR(CDR(env->head))==NULL) { |
1403 |
printerr("Too Few Arguments"); |
printerr("Too Few Arguments"); |
1404 |
env->err= 1; |
env->err= 1; |
1405 |
return; |
return; |
1413 |
} |
} |
1414 |
|
|
1415 |
swap(env); toss(env); |
swap(env); toss(env); |
1416 |
ifelse(env); |
sx_6966(env); |
1417 |
} |
} |
1418 |
|
|
1419 |
/* "while" */ |
/* "while" */ |