/* types.h

  typedef enum {CHAR,INT,ARRAY,POINTER,CARTESIAN,MAPPING,UNKNOWN} type_info;
  typedef struct tnode {
     type_info info;
     struct tnode *p1, *p2;
     int array_size;
  } typenode, *typeptr;

typeptr new_node(type_info info);
typeptr map(),cartesian();

typedef struct s {
  char *name;
  typeptr t;
  struct s *next;
} typetable;
*/

typeptr new_node(type_info info) {
  typeptr t;
  t = (typeptr)malloc(sizeof(typenode));
  t->info = info;
  t->p1 = NULL;
  t->p2 = NULL;
  return t;
}

int typematch(typeptr t1, typeptr t2) {
   int v;
   if (t1 && t2) 
   if (t1->info == t2->info) 
     switch (t1->info) {
       case CHAR: return 1;
       case INT: return 1;
       case ARRAY: if (t1->array_size == t2->array_size) 
                     return typematch(t1->p1,t2->p1);
		   else return 0;
       case POINTER: return typematch(t1->p1, t2->p1); 
       case CARTESIAN: v = typematch(t1->p1, t2->p1);
                     if (v) return typematch(t1->p2,t2->p2);
                     else return 0;
       case MAPPING: v = typematch(t1->p1, t2->p1);
                     if (v) return typematch(t1->p2,t2->p2);
                     else return 0;
       case UNKNOWN: return 0;
     }  /* switch */
     else return 0;
   else if (!t1 && !t2) return 1;
   else return 0;
}

typeptr map(typeptr t1,typeptr t2) {
   typeptr t;
   t = (typeptr)malloc(sizeof(typenode));
   t->info = MAPPING;
   t->p1 = t1;
   t->p2 = t2;
   return t;
}

typeptr cartesian(typeptr t1,typeptr t2) {
   typeptr t;
   t = (typeptr)malloc(sizeof(typenode));
   t->info = CARTESIAN;
   t->p1 = t1;
   t->p2 = t2;
   return t;
}

typeptr array(typeptr t1,int size) {
  typeptr t;
   t = (typeptr)malloc(sizeof(typenode));
   t->info = ARRAY;
   t->p1 = t1;
   t->p2 = NULL;
   t->array_size = size;
   return t;
}

typeptr pointer(typeptr t1) {
  typeptr t;
   t = (typeptr)malloc(sizeof(typenode));
   t->info = POINTER;
   t->p2 = NULL;
   t->p1 = t1;
   return t;
}

typetable *type_table = NULL;

add_symbol(char *name,typeptr type) {
  typetable *t;
  t = (typetable*)malloc(sizeof(typetable));
  t->name = (char*)malloc(strlen(name)+1);
  strcpy(t->name,name);
  t->t = type;
  t->next = type_table;
  type_table = t; 
}

typeptr
lookup(char *name) {
  typetable *t;
  t = type_table;
  while (t) {
    if (strcmp(t->name,name) ==0) return t->t;
    t = t->next;
  }
  return NULL;
  
}



