/[cvs]/stack/stack.c
ViewVC logotype

Diff of /stack/stack.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.56 by teddy, Fri Feb 8 02:28:41 2002 UTC revision 1.64 by teddy, Fri Feb 8 16:33:14 2002 UTC
# Line 347  extern void type(environment *env){ Line 347  extern void type(environment *env){
347    case list:    case list:
348      push_sym(env, "list");      push_sym(env, "list");
349      break;      break;
   default:  
     push_sym(env, "unknown");  
     break;  
350    }    }
351  }      }    
352    
# Line 361  void print_h(stackitem *stack_head) Line 358  void print_h(stackitem *stack_head)
358      printf("%d", stack_head->item->content.val);      printf("%d", stack_head->item->content.val);
359      break;      break;
360    case string:    case string:
361      printf("\"%s\"", (char*)stack_head->item->content.ptr);      printf("%s", (char*)stack_head->item->content.ptr);
362      break;      break;
363    case symb:    case symb:
364      printf("%s", ((symbol *)(stack_head->item->content.ptr))->id);      printf("%s", ((symbol *)(stack_head->item->content.ptr))->id);
# Line 380  void print_h(stackitem *stack_head) Line 377  void print_h(stackitem *stack_head)
377      }      }
378      printf("]");      printf("]");
379      break;      break;
   default:  
     printf("#<unknown %p>", (stack_head->item->content.ptr));  
     break;  
380    }    }
381  }  }
382    
# Line 502  extern void eval(environment *env) Line 496  extern void eval(environment *env)
496      return;      return;
497    }    }
498    
499     eval_start:
500    
501    switch(env->head->item->type) {    switch(env->head->item->type) {
502      /* if it's a symbol */      /* if it's a symbol */
503    case symb:    case symb:
504      rcl(env);                   /* get its contents */      rcl(env);                   /* get its contents */
505      if(env->err) return;      if(env->err) return;
506      if(env->head->item->type!=symb){ /* don't recurse symbols */      if(env->head->item->type!=symb){ /* don't recurse symbols */
507        eval(env);                        /* evaluate the value */        goto eval_start;
       return;  
508      }      }
509      break;      return;
510    
511      /* If it's a lone function value, run it */      /* If it's a lone function value, run it */
512    case func:    case func:
513      in_func= (funcp)(env->head->item->content.ptr);      in_func= (funcp)(env->head->item->content.ptr);
514      toss(env);      toss(env);
515      if(env->err) return;      if(env->err) return;
516      (*in_func)(env);      return (*in_func)(env);
     break;  
517    
518      /* If it's a list */      /* If it's a list */
519    case list:    case list:
# Line 528  extern void eval(environment *env) Line 522  extern void eval(environment *env)
522      toss(env);      toss(env);
523      if(env->err) return;      if(env->err) return;
524      iterator= (stackitem*)temp_val->content.ptr;      iterator= (stackitem*)temp_val->content.ptr;
525      while(iterator!=NULL && iterator->item!=NULL) {      while(iterator!=NULL) {
526        push_val(&(env->head), iterator->item);        push_val(&(env->head), iterator->item);
527        if(env->head->item->type==symb        if(env->head->item->type==symb
528          && strcmp(";", ((symbol*)(env->head->item->content.ptr))->id)==0) {          && strcmp(";", ((symbol*)(env->head->item->content.ptr))->id)==0) {
529          toss(env);          toss(env);
530          if(env->err) return;          if(env->err) return;
531            if(iterator->next == NULL){
532              free_val(temp_val);
533              goto eval_start;
534            }
535          eval(env);          eval(env);
536          if(env->err) return;          if(env->err) return;
537        }        }
538        iterator= iterator->next;        iterator= iterator->next;
539      }      }
540      free_val(temp_val);      free_val(temp_val);
541      break;      return;
542    
543      /* If it's a string */      /* If it's a string */
544    case string:    case string:
# Line 550  extern void eval(environment *env) Line 548  extern void eval(environment *env)
548      if(env->err) return;      if(env->err) return;
549      temp_string= malloc(strlen((char*)temp_val->content.ptr)+5);      temp_string= malloc(strlen((char*)temp_val->content.ptr)+5);
550      strcpy(temp_string, "[ ");      strcpy(temp_string, "[ ");
551      strcat(temp_string, (char*)temp_val->content.ptr);      strcpy(temp_string+2, (char*)temp_val->content.ptr);
552        free_val(temp_val);
553      strcat(temp_string, " ]");      strcat(temp_string, " ]");
554      stack_read(env, temp_string);      stack_read(env, temp_string);
     eval(env);  
     if(env->err) return;  
     free_val(temp_val);  
555      free(temp_string);      free(temp_string);
556      break;      goto eval_start;
557    
558    case integer:    case integer:
559      break;      return;
560    }    }
561  }  }
562    
# Line 961  extern void sx_2b(environment *env) { Line 957  extern void sx_2b(environment *env) {
957    a=env->head->item->content.val;    a=env->head->item->content.val;
958    toss(env);    toss(env);
959    if(env->err) return;    if(env->err) return;
960    b=env->head->item->content.val;    if(env->head->item->refcount == 1)
961        env->head->item->content.val += a;
962      else {
963        b=env->head->item->content.val;
964        toss(env);
965        if(env->err) return;
966        push_int(&(env->head), a+b);
967      }
968    }
969    
970    /* - */
971    extern void sx_2d(environment *env) {
972      int a, b;
973    
974      if((env->head)==NULL || env->head->next==NULL) {
975        printerr("Too Few Arguments");
976        env->err=1;
977        return;
978      }
979      
980      if(env->head->item->type!=integer
981         || env->head->next->item->type!=integer) {
982        printerr("Bad Argument Type");
983        env->err=2;
984        return;
985      }
986      a=env->head->item->content.val;
987      toss(env);
988      if(env->err) return;
989      if(env->head->item->refcount == 1)
990        env->head->item->content.val -= a;
991      else {
992        b=env->head->item->content.val;
993        toss(env);
994        if(env->err) return;
995        push_int(&(env->head), b-a);
996      }
997    }
998    
999    /* > */
1000    extern void sx_3e(environment *env) {
1001      int a, b;
1002    
1003      if((env->head)==NULL || env->head->next==NULL) {
1004        printerr("Too Few Arguments");
1005        env->err=1;
1006        return;
1007      }
1008      
1009      if(env->head->item->type!=integer
1010         || env->head->next->item->type!=integer) {
1011        printerr("Bad Argument Type");
1012        env->err=2;
1013        return;
1014      }
1015      a=env->head->item->content.val;
1016    toss(env);    toss(env);
1017    if(env->err) return;    if(env->err) return;
1018    push_int(&(env->head), a+b);    if(env->head->item->refcount == 1)
1019        env->head->item->content.val = (env->head->item->content.val > a);
1020      else {
1021        b=env->head->item->content.val;
1022        toss(env);
1023        if(env->err) return;
1024        push_int(&(env->head), b>a);
1025      }
1026  }  }
1027    
1028  /* Return copy of a value */  /* Return copy of a value */
# Line 1022  extern void dup(environment *env) { Line 1080  extern void dup(environment *env) {
1080    push_val(&(env->head), copy_val(env->head->item));    push_val(&(env->head), copy_val(env->head->item));
1081  }  }
1082    
1083  /* If-Then */  /* "if", If-Then */
1084  extern void ift(environment *env) {  extern void sx_6966(environment *env) {
1085    
1086    int truth;    int truth;
1087    
# Line 1053  extern void ift(environment *env) { Line 1111  extern void ift(environment *env) {
1111      toss(env);      toss(env);
1112  }  }
1113    
   
1114  /* If-Then-Else */  /* If-Then-Else */
1115  extern void ifte(environment *env) {  extern void ifelse(environment *env) {
1116    
1117    int truth;    int truth;
1118    
# Line 1090  extern void ifte(environment *env) { Line 1147  extern void ifte(environment *env) {
1147    eval(env);    eval(env);
1148  }  }
1149    
1150    /* while */
1151    extern void sx_7768696c65(environment *env) {
1152    
1153      int truth;
1154      value *loop, *test;
1155    
1156      if((env->head)==NULL || env->head->next==NULL) {
1157        printerr("Too Few Arguments");
1158        env->err=1;
1159        return;
1160      }
1161    
1162      loop= env->head->item;
1163      loop->refcount++;
1164      toss(env); if(env->err) return;
1165    
1166      test= env->head->item;
1167      test->refcount++;
1168      toss(env); if(env->err) return;
1169    
1170      do {
1171        push_val(&(env->head), test);
1172        eval(env);
1173        
1174        if(env->head->item->type != integer) {
1175          printerr("Bad Argument Type");
1176          env->err=2;
1177          return;
1178        }
1179        
1180        truth= env->head->item->content.val;
1181        toss(env); if(env->err) return;
1182        
1183        if(truth) {
1184          push_val(&(env->head), loop);
1185          eval(env);
1186        } else {
1187          toss(env);
1188        }
1189      
1190      } while(truth);
1191    
1192      free_val(test);
1193      free_val(loop);
1194    }

Legend:
Removed from v.1.56  
changed lines
  Added in v.1.64

root@recompile.se
ViewVC Help
Powered by ViewVC 1.1.26