aboutsummaryrefslogblamecommitdiff
path: root/semantics.c
blob: 30a24f74dfdb8af5294dc29e6cbb0fb53700d0c1 (plain) (tree)
1
2
3
4
5
6
7
8
9
                   
                   
                   
                  
                      
                
                                                
                                                     
 








                                                             
                                          

                                                          


                      
      
 
                                                   
                                                      

                             
                                 



                                







                                                                     




                            
             

 

                                                             










                                         
                
                  



                                                     

                                        

                    
             

 
                                             


                    






                                                         

 
                                                


                    






                                                            




                                

                     




                               
                            

              


                                              
                                                 
                                              
                                                  
                

 

                                      
                                        





                                                 
                                                                        

                                  
                                        




                                      
                                                
















                                              
                                                

 
                                                        


                                         
                                                          

                                          





                                            
              
























                                                   


















































































































































                                                                                      
              
 






























                                                                               
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <stdio.h>
#include "semantics.h"
#include "ast.h"
#define NEW(type) ((type *)malloc(sizeof(type)))
#define CHECK_TYPE(p, _type) assert(p->type == _type)

#ifdef CIBIC_DEBUG
CTable_t ctable_create(Hashfunc_t hfunc, Printfunc_t pfunc) {
    CTable_t ct = NEW(CTable);
    memset(ct->head, 0, sizeof(CTNode*) * MAX_TABLE_SIZE);
    ct->hfunc = hfunc;
    ct->pfunc = pfunc;
    return ct;
}
#else
CTable_t ctable_create(Hashfunc_t hfunc) {
    CTable_t ct = NEW(CTable);
    memset(ct->head, 0, sizeof(CTNode*) * MAX_TABLE_SIZE);
    ct->hfunc = hfunc;
    return ct;
}
#endif

void *ctable_lookup(CTable_t ct, const char *key) {
    unsigned int hv = ct->hfunc(key) % MAX_TABLE_SIZE;
    CTNode *p = ct->head[hv];
    for (; p; p = p->next)
        if (!strcmp(p->key, key))
            return p->val;
    return NULL; /* not found */
}

int ctable_insert(CTable_t ct, const char *key, void *val, int lvl) {
    unsigned int hv = ct->hfunc(key) % MAX_TABLE_SIZE;
    CTNode *p = ct->head[hv];
    CTNode *np;
    for (; p && p->lvl == lvl; p = p->next)
        if (!strcmp(p->key, key))
            return 0; /* conflict */
    np = NEW(CTNode);
    np->key = key;
    np->val = val;
    np->lvl = lvl;
    np->next = ct->head[hv];
    ct->head[hv] = np;
    return 1;
}

void ctable_clip(CTable_t ct, const char *key, int max_lvl) {
    unsigned int hv = ct->hfunc(key) % MAX_TABLE_SIZE;
    CTNode *p = ct->head[hv], *np;
    for (; p && p->lvl >