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

Diff of /stack/stack.c

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

revision 1.111 by teddy, Sat Mar 16 19:09:54 2002 UTC revision 1.113 by teddy, Sun Mar 17 00:55:58 2002 UTC
# Line 20  Line 20 
20               Teddy Hogeborn <teddy@fukt.bth.se>               Teddy Hogeborn <teddy@fukt.bth.se>
21  */  */
22    
23  #define CAR(X) X->content.c->car  #define CAR(X) (X->content.c->car)
24  #define CDR(X) X->content.c->cdr  #define CDR(X) (X->content.c->cdr)
25    
26  /* printf, sscanf, fgets, fprintf, fopen, perror */  /* printf, sscanf, fgets, fprintf, fopen, perror */
27  #include <stdio.h>  #include <stdio.h>
# Line 450  extern void nl() Line 450  extern void nl()
450  /* Gets the type of a value */  /* Gets the type of a value */
451  extern void type(environment *env)  extern void type(environment *env)
452  {  {
   int typenum;  
   
453    if(env->head->type==empty) {    if(env->head->type==empty) {
454      printerr("Too Few Arguments");      printerr("Too Few Arguments");
455      env->err= 1;      env->err= 1;
456      return;      return;
457    }    }
458    
459    typenum= CAR(env->head)->type;    switch(CAR(env->head)->type){
460    toss(env);    case empty:
461    switch(typenum){      push_sym(env, "empty");
462        break;
463    case integer:    case integer:
464      push_sym(env, "integer");      push_sym(env, "integer");
465      break;      break;
# Line 477  extern void type(environment *env) Line 476  extern void type(environment *env)
476      push_sym(env, "function");      push_sym(env, "function");
477      break;      break;
478    case tcons:    case tcons:
479      push_sym(env, "list");      push_sym(env, "pair");
480      break;      break;
481    }    }
482      swap(env);
483      if (env->err) return;
484      toss(env);
485  }      }    
486    
487  /* Prints the top element of the stack. */  /* Prints the top element of the stack. */
488  void print_h(value *stack_head, int noquote)  void print_val(value *val, int noquote)
489  {  {
490    switch(CAR(stack_head)->type) {    switch(val->type) {
491      case empty:
492        printf("[]");
493        break;
494    case integer:    case integer:
495      printf("%d", CAR(stack_head)->content.i);      printf("%d", val->content.i);
496      break;      break;
497    case tfloat:    case tfloat:
498      printf("%f", CAR(stack_head)->content.f);      printf("%f", val->content.f);
499      break;      break;
500    case string:    case string:
501      if(noquote)      if(noquote)
502        printf("%s", (char*)CAR(stack_head)->content.ptr);        printf("%s", (char*)(val->content.ptr));
503      else      else
504        printf("\"%s\"", (char*)CAR(stack_head)->content.ptr);        printf("\"%s\"", (char*)(val->content.ptr));
505      break;      break;
506    case symb:    case symb:
507      printf("%s", CAR(stack_head)->content.sym->id);      printf("%s", val->content.sym->id);
508      break;      break;
509    case func:    case func:
510      printf("#<function %p>", (funcp)(CAR(stack_head)->content.ptr));      printf("#<function %p>", (funcp)(val->content.ptr));
511      break;      break;
512    case tcons:    case tcons:
     /* A list is just a stack, so make stack_head point to it */  
     stack_head= CAR(stack_head);  
513      printf("[ ");      printf("[ ");
514      while(CAR(stack_head)->type != empty) {      do {
515        print_h(stack_head, noquote);        print_val(CAR(val), noquote);
516        if(CDR(stack_head)->type==tcons)        switch(CDR(val)->type){
517          case empty:
518            break;
519          case tcons:
520          printf(" ");          printf(" ");
521        else          break;
522          default:
523          printf(" . ");          /* Improper list */          printf(" . ");          /* Improper list */
524        stack_head= CDR(stack_head);          print_val(CDR(val), noquote);
525      }        }
526          val= CDR(val);
527        } while(val->type == tcons);
528      printf(" ]");      printf(" ]");
529      break;      break;
530    }    }
# Line 528  extern void print_(environment *env) Line 537  extern void print_(environment *env)
537      env->err= 1;      env->err= 1;
538      return;      return;
539    }    }
540    print_h(env->head, 0);    print_val(CAR(env->head), 0);
541    nl();    nl();
542  }  }
543    
# Line 547  extern void princ_(environment *env) Line 556  extern void princ_(environment *env)
556      env->err= 1;      env->err= 1;
557      return;      return;
558    }    }
559    print_h(env->head, 1);    print_val(CAR(env->head), 1);
560  }  }
561    
562  /* Prints the top element of the stack and then discards it. */  /* Prints the top element of the stack and then discards it. */
# Line 564  void print_st(value *stack_head, long co Line 573  void print_st(value *stack_head, long co
573    if(CDR(stack_head)->type != empty)    if(CDR(stack_head)->type != empty)
574      print_st(CDR(stack_head), counter+1);      print_st(CDR(stack_head), counter+1);
575    printf("%ld: ", counter);    printf("%ld: ", counter);
576    print_h(stack_head, 0);    print_val(CAR(stack_head), 0);
577    nl();    nl();
578  }  }
579    
# Line 2271  extern void sx_646976(environment *env) Line 2280  extern void sx_646976(environment *env)
2280    printerr("Bad Argument Type");    printerr("Bad Argument Type");
2281    env->err= 2;    env->err= 2;
2282  }  }
2283    
2284    extern void setcar(environment *env)
2285    {
2286      if(env->head->type==empty || CDR(env->head)->type==empty) {
2287        printerr("Too Few Arguments");
2288        env->err= 1;
2289        return;
2290      }
2291    
2292      if(CDR(env->head)->type!=tcons) {
2293        printerr("Bad Argument Type");
2294        env->err= 2;
2295        return;
2296      }
2297    
2298      CAR(CAR(CDR(env->head)))=CAR(env->head);
2299      toss(env);
2300    }
2301    
2302    extern void setcdr(environment *env)
2303    {
2304      if(env->head->type==empty || CDR(env->head)->type==empty) {
2305        printerr("Too Few Arguments");
2306        env->err= 1;
2307        return;
2308      }
2309    
2310      if(CDR(env->head)->type!=tcons) {
2311        printerr("Bad Argument Type");
2312        env->err= 2;
2313        return;
2314      }
2315    
2316      CDR(CAR(CDR(env->head)))=CAR(env->head);
2317      toss(env);
2318    }
2319    
2320    extern void car(environment *env)
2321    {
2322      if(env->head->type==empty) {
2323        printerr("Too Few Arguments");
2324        env->err= 1;
2325        return;
2326      }
2327    
2328      if(CAR(env->head)->type!=tcons) {
2329        printerr("Bad Argument Type");
2330        env->err= 2;
2331        return;
2332      }
2333    
2334      CAR(env->head)=CAR(CAR(env->head));
2335    }
2336    
2337    extern void cdr(environment *env)
2338    {
2339      if(env->head->type==empty) {
2340        printerr("Too Few Arguments");
2341        env->err= 1;
2342        return;
2343      }
2344    
2345      if(CAR(env->head)->type!=tcons) {
2346        printerr("Bad Argument Type");
2347        env->err= 2;
2348        return;
2349      }
2350    
2351      CAR(env->head)=CDR(CAR(env->head));
2352    }

Legend:
Removed from v.1.111  
changed lines
  Added in v.1.113

root@recompile.se
ViewVC Help
Powered by ViewVC 1.1.26