Advertisement
KaeruCT

finished? map

Dec 13th, 2011
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.56 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <assert.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. struct Map {
  7.     int length;
  8.     int allocated;
  9.     char **keys;
  10.     char **values;
  11. };
  12.  
  13. struct Map *Map_create()
  14. {
  15.     struct Map *map = malloc(sizeof(struct Map));
  16.     assert(map != NULL);
  17.    
  18.     map->allocated = 0;
  19.     map->length = 0;
  20.     map->keys = NULL;
  21.     map->values = NULL;
  22.    
  23.     return map;
  24. }
  25.  
  26. char* Map_get(struct Map *map, char *key)
  27. {
  28.     assert(map != NULL);
  29.    
  30.     int i;
  31.    
  32.     for(i = 0; i < map->length; i++){
  33.         if(strcmp(key, map->keys[i]) == 0){
  34.             return map->values[i];
  35.         }
  36.     }
  37.    
  38.     return NULL;
  39. }
  40.  
  41. int Map_get_key_index(struct Map *map, char *key)
  42. {
  43.     assert(map != NULL);
  44.     int i;
  45.    
  46.     for(i = 0; i < map->length; i++){
  47.         if(strcmp(key, map->keys[i]) == 0){
  48.             return i;
  49.         }
  50.     }
  51.    
  52.     return -1;
  53. }
  54.  
  55. int Map_contains_key(struct Map *map, char *key)
  56. {
  57.     assert(map != NULL);
  58.     int i;
  59.    
  60.     for(i = 0; i < map->length; i++){
  61.         if(strcmp(key, map->keys[i]) == 0){
  62.             return 1;
  63.         }
  64.     }
  65.    
  66.     return 0;
  67. }
  68.  
  69. int Map_contains_value(struct Map *map, char *value)
  70. {
  71.     assert(map != NULL);
  72.     int i;
  73.    
  74.     for(i = 0; i < map->length; i++){
  75.         if(strcmp(value, map->values[i]) == 0){
  76.             return 1;
  77.         }
  78.     }
  79.    
  80.     return 0;
  81. }
  82.  
  83. void Map_remove(struct Map *map, char *key)
  84. {
  85.     assert(map != NULL);
  86.    
  87.     // check if key exists and get its index
  88.     int k = Map_get_key_index(map, key);
  89.     int i = 0;
  90.    
  91.     if(k > -1){
  92.         // map is now shorter
  93.         map->length--;
  94.    
  95.         // shift all the key/values pairs
  96.         // after the "erased pair" upwards
  97.         for(i = k; i < map->length; i++){
  98.             map->keys[i] = map->keys[i+1];
  99.             map->values[i] = map->values[i+1];
  100.         }
  101.     }
  102. }
  103.  
  104. void Map_put(struct Map *map, char *key, char *value)
  105. {
  106.     assert(map != NULL);
  107.     int i = Map_get_key_index(map, key);
  108.     int k; // index of the new key/value pair
  109.    
  110.     if(i > -1){
  111.         // will overwrite existing value if key already exists
  112.         k = i;
  113.     }else{
  114.         // will add a new key/value pair
  115.        
  116.         // check if there's enough space
  117.         if(map->length == map->allocated){
  118.        
  119.             // allocate more space
  120.             if(map->allocated == 0){
  121.                 // begin allocating 2
  122.                 map->allocated = 2;
  123.             }else{
  124.                 // double if more is needed
  125.                 map->allocated *= 2;
  126.             }
  127.            
  128.             void *tmp_keys = realloc(map->keys, map->allocated * sizeof(key));
  129.             void *tmp_values = realloc(map->values, map->allocated * sizeof(value));
  130.            
  131.             map->keys = (char**)tmp_keys;
  132.             map->values = (char**)tmp_values;
  133.         }
  134.        
  135.         // increase the length
  136.         k = map->length;
  137.         map->length = k + 1;
  138.     }
  139.    
  140.     // write key/value pair to k index
  141.     map->keys[k] = key;
  142.     map->values[k] = value;
  143. }
  144.  
  145.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement