| 218 |
switch (val->type){ /* and free the contents if necessary */ |
switch (val->type){ /* and free the contents if necessary */ |
| 219 |
case string: |
case string: |
| 220 |
free(val->content.ptr); |
free(val->content.ptr); |
| 221 |
|
break; |
| 222 |
case list: /* lists needs to be freed recursively */ |
case list: /* lists needs to be freed recursively */ |
| 223 |
item=val->content.ptr; |
item=val->content.ptr; |
| 224 |
while(item != NULL) { /* for all stack items */ |
while(item != NULL) { /* for all stack items */ |
| 241 |
stackitem *temp= env->head; |
stackitem *temp= env->head; |
| 242 |
|
|
| 243 |
if((env->head)==NULL) { |
if((env->head)==NULL) { |
| 244 |
printerr("Stack empty"); |
printerr("Too Few Arguments"); |
| 245 |
env->err=1; |
env->err=1; |
| 246 |
return; |
return; |
| 247 |
} |
} |
| 257 |
printf("\n"); |
printf("\n"); |
| 258 |
} |
} |
| 259 |
|
|
| 260 |
|
/* Gets the type of a value */ |
| 261 |
|
extern void type(environment *env){ |
| 262 |
|
int typenum; |
| 263 |
|
|
| 264 |
|
if((env->head)==NULL) { |
| 265 |
|
printerr("Too Few Arguments"); |
| 266 |
|
env->err=1; |
| 267 |
|
return; |
| 268 |
|
} |
| 269 |
|
typenum=env->head->item->type; |
| 270 |
|
toss(env); |
| 271 |
|
switch(typenum){ |
| 272 |
|
case integer: |
| 273 |
|
push_sym(env, "integer"); |
| 274 |
|
break; |
| 275 |
|
case string: |
| 276 |
|
push_sym(env, "string"); |
| 277 |
|
break; |
| 278 |
|
case symb: |
| 279 |
|
push_sym(env, "symbol"); |
| 280 |
|
break; |
| 281 |
|
case func: |
| 282 |
|
push_sym(env, "function"); |
| 283 |
|
break; |
| 284 |
|
case list: |
| 285 |
|
push_sym(env, "list"); |
| 286 |
|
break; |
| 287 |
|
default: |
| 288 |
|
push_sym(env, "unknown"); |
| 289 |
|
break; |
| 290 |
|
} |
| 291 |
|
} |
| 292 |
|
|
| 293 |
/* Prints the top element of the stack. */ |
/* Prints the top element of the stack. */ |
| 294 |
void print_h(stackitem *stack_head) |
void print_h(stackitem *stack_head) |
| 295 |
{ |
{ |
| 317 |
|
|
| 318 |
extern void print_(environment *env) { |
extern void print_(environment *env) { |
| 319 |
if(env->head==NULL) { |
if(env->head==NULL) { |
| 320 |
printerr("Stack empty"); |
printerr("Too Few Arguments"); |
| 321 |
env->err=1; |
env->err=1; |
| 322 |
return; |
return; |
| 323 |
} |
} |
| 348 |
extern void printstack(environment *env) |
extern void printstack(environment *env) |
| 349 |
{ |
{ |
| 350 |
if(env->head == NULL) { |
if(env->head == NULL) { |
|
printerr("Stack empty"); |
|
|
env->err=1; |
|
| 351 |
return; |
return; |
| 352 |
} |
} |
| 353 |
print_st(env->head, 1); |
print_st(env->head, 1); |
| 360 |
stackitem *temp= env->head; |
stackitem *temp= env->head; |
| 361 |
|
|
| 362 |
if((env->head)==NULL) { |
if((env->head)==NULL) { |
| 363 |
printerr("Stack empty"); |
printerr("Too Few Arguments"); |
| 364 |
env->err=1; |
env->err=1; |
| 365 |
return; |
return; |
| 366 |
} |
} |
| 367 |
|
|
| 368 |
if(env->head->next==NULL) { |
if(env->head->next==NULL) { |
| 369 |
printerr("Not enough arguments"); |
printerr("Too Few Arguments"); |
| 370 |
env->err=1; |
env->err=1; |
| 371 |
return; |
return; |
| 372 |
} |
} |
| 392 |
value *val; |
value *val; |
| 393 |
|
|
| 394 |
if(env->head == NULL) { |
if(env->head == NULL) { |
| 395 |
printerr("Stack empty"); |
printerr("Too Few Arguments"); |
| 396 |
env->err=1; |
env->err=1; |
| 397 |
return; |
return; |
| 398 |
} |
} |
| 399 |
|
|
| 400 |
if(env->head->item->type!=symb) { |
if(env->head->item->type!=symb) { |
| 401 |
printerr("Not a symbol"); |
printerr("Bad Argument Type"); |
| 402 |
env->err=1; |
env->err=2; |
| 403 |
return; |
return; |
| 404 |
} |
} |
| 405 |
|
|
| 406 |
val=((symbol *)(env->head->item->content.ptr))->val; |
val=((symbol *)(env->head->item->content.ptr))->val; |
| 407 |
if(val == NULL){ |
if(val == NULL){ |
| 408 |
printerr("Unbound variable"); |
printerr("Unbound Variable"); |
| 409 |
env->err=1; |
env->err=3; |
| 410 |
return; |
return; |
| 411 |
} |
} |
| 412 |
toss(env); /* toss the symbol */ |
toss(env); /* toss the symbol */ |
| 421 |
{ |
{ |
| 422 |
funcp in_func; |
funcp in_func; |
| 423 |
if(env->head==NULL) { |
if(env->head==NULL) { |
| 424 |
printerr("Stack empty"); |
printerr("Too Few Arguments"); |
| 425 |
env->err=1; |
env->err=1; |
| 426 |
return; |
return; |
| 427 |
} |
} |
| 489 |
} |
} |
| 490 |
|
|
| 491 |
/* Parse input. */ |
/* Parse input. */ |
| 492 |
int stack_read(environment *env, char *in_line) |
void stack_read(environment *env, char *in_line) |
| 493 |
{ |
{ |
| 494 |
char *temp, *rest; |
char *temp, *rest; |
| 495 |
int itemp; |
int itemp; |
| 550 |
} |
} |
| 551 |
} while(0); |
} while(0); |
| 552 |
|
|
|
|
|
| 553 |
free(temp); |
free(temp); |
| 554 |
|
|
| 555 |
if(convert<2) { |
if(convert<2) { |
| 556 |
free(rest); |
free(rest); |
| 557 |
return 0; |
return; |
| 558 |
} |
} |
| 559 |
|
|
| 560 |
stack_read(env, rest); |
stack_read(env, rest); |
| 561 |
|
|
| 562 |
free(rest); |
free(rest); |
|
return 1; |
|
| 563 |
} |
} |
| 564 |
|
|
| 565 |
/* Relocate elements of the list on the stack. */ |
/* Relocate elements of the list on the stack. */ |
| 568 |
stackitem *temp, *new_head; |
stackitem *temp, *new_head; |
| 569 |
|
|
| 570 |
/* Is top element a list? */ |
/* Is top element a list? */ |
| 571 |
if(env->head==NULL || env->head->item->type!=list) { |
if(env->head==NULL) { |
| 572 |
printerr("Stack empty or not a list"); |
printerr("Too Few Arguments"); |
| 573 |
env->err=1; |
env->err=1; |
| 574 |
return; |
return; |
| 575 |
} |
} |
| 576 |
|
if(env->head->item->type!=list) { |
| 577 |
|
printerr("Bad Argument Type"); |
| 578 |
|
env->err=2; |
| 579 |
|
return; |
| 580 |
|
} |
| 581 |
|
|
| 582 |
/* The first list element is the new stack head */ |
/* The first list element is the new stack head */ |
| 583 |
new_head= temp= env->head->item->content.ptr; |
new_head= temp= env->head->item->content.ptr; |
| 602 |
int result; |
int result; |
| 603 |
|
|
| 604 |
if((env->head)==NULL || env->head->next==NULL) { |
if((env->head)==NULL || env->head->next==NULL) { |
| 605 |
printerr("Not enough elements to compare"); |
printerr("Too Few Arguments"); |
| 606 |
env->err=1; |
env->err=1; |
| 607 |
return; |
return; |
| 608 |
} |
} |
| 621 |
{ |
{ |
| 622 |
int val; |
int val; |
| 623 |
|
|
| 624 |
if((env->head)==NULL || env->head->item->type!=integer) { |
if((env->head)==NULL) { |
| 625 |
printerr("Stack empty or element is not a integer"); |
printerr("Too Few Arguments"); |
| 626 |
env->err=1; |
env->err=1; |
| 627 |
return; |
return; |
| 628 |
} |
} |
| 629 |
|
|
| 630 |
|
if(env->head->item->type!=integer) { |
| 631 |
|
printerr("Bad Argument Type"); |
| 632 |
|
env->err=2; |
| 633 |
|
return; |
| 634 |
|
} |
| 635 |
|
|
| 636 |
val= env->head->item->content.val; |
val= env->head->item->content.val; |
| 637 |
toss(env); |
toss(env); |
| 638 |
push_int(&(env->head), !val); |
push_int(&(env->head), !val); |
| 652 |
symbol *sym; |
symbol *sym; |
| 653 |
|
|
| 654 |
/* Needs two values on the stack, the top one must be a symbol */ |
/* Needs two values on the stack, the top one must be a symbol */ |
| 655 |
if(env->head==NULL || env->head->next==NULL |
if(env->head==NULL || env->head->next==NULL) { |
| 656 |
|| env->head->item->type!=symb) { |
printerr("Too Few Arguments"); |
|
printerr("Define what?"); |
|
| 657 |
env->err=1; |
env->err=1; |
| 658 |
return; |
return; |
| 659 |
} |
} |
| 660 |
|
|
| 661 |
|
if(env->head->item->type!=symb) { |
| 662 |
|
printerr("Bad Argument Type"); |
| 663 |
|
env->err=2; |
| 664 |
|
return; |
| 665 |
|
} |
| 666 |
|
|
| 667 |
/* long names are a pain */ |
/* long names are a pain */ |
| 668 |
sym=env->head->item->content.ptr; |
sym=env->head->item->content.ptr; |
| 669 |
|
|
| 713 |
stackitem *stack_head= env->head; |
stackitem *stack_head= env->head; |
| 714 |
symbol **hash_entry, *temp; |
symbol **hash_entry, *temp; |
| 715 |
|
|
| 716 |
if(stack_head==NULL || stack_head->item->type!=symb) { |
if(stack_head==NULL) { |
| 717 |
printerr("Stack empty or not a symbol"); |
printerr("Too Few Arguments"); |
| 718 |
|
env->err=1; |
| 719 |
|
return; |
| 720 |
|
} |
| 721 |
|
|
| 722 |
|
if(stack_head->item->type!=symb) { |
| 723 |
|
printerr("Bad Argument Type"); |
| 724 |
|
env->err=2; |
| 725 |
return; |
return; |
| 726 |
} |
} |
| 727 |
|
|
| 737 |
} |
} |
| 738 |
free(temp->id); |
free(temp->id); |
| 739 |
free(temp); |
free(temp); |
| 740 |
} |
} |
| 741 |
|
|
| 742 |
|
/* Returns the current error number to the stack */ |
| 743 |
|
extern void errn(environment *env){ |
| 744 |
|
push_int(&(env->head), env->err); |
| 745 |
|
} |
| 746 |
|
|
| 747 |
int main() |
int main() |
| 748 |
{ |
{ |