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

Diff of /stack/stack.c

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

revision 1.35 by teddy, Wed Feb 6 00:30:14 2002 UTC revision 1.37 by teddy, Wed Feb 6 01:51:08 2002 UTC
# Line 218  void free_val(value *val){ Line 218  void free_val(value *val){
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 */
# Line 240  extern void toss(environment *env) Line 241  extern void toss(environment *env)
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    }    }
# Line 256  extern void nl() Line 257  extern void nl()
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  {  {
# Line 283  void print_h(stackitem *stack_head) Line 317  void print_h(stackitem *stack_head)
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    }    }
# Line 314  void print_st(stackitem *stack_head, lon Line 348  void print_st(stackitem *stack_head, lon
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);
# Line 328  extern void swap(environment *env) Line 360  extern void swap(environment *env)
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    }    }
# Line 360  extern void rcl(environment *env) Line 392  extern void rcl(environment *env)
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 */
# Line 389  extern void eval(environment *env) Line 421  extern void eval(environment *env)
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    }    }
# Line 457  extern void pack(environment *env) Line 489  extern void pack(environment *env)
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;
# Line 518  int stack_read(environment *env, char *i Line 550  int stack_read(environment *env, char *i
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. */
# Line 538  extern void expand(environment *env) Line 568  extern void expand(environment *env)
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;
# Line 567  extern void eq(environment *env) Line 602  extern void eq(environment *env)
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    }    }
# Line 586  extern void not(environment *env) Line 621  extern void not(environment *env)
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);
# Line 611  extern void def(environment *env) Line 652  extern void def(environment *env)
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    
# Line 667  extern void forget(environment *env) Line 713  extern void forget(environment *env)
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    
# Line 684  extern void forget(environment *env) Line 737  extern void forget(environment *env)
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  {  {

Legend:
Removed from v.1.35  
changed lines
  Added in v.1.37

root@recompile.se
ViewVC Help
Powered by ViewVC 1.1.26