static char* prepend_not_empty(void) { linked_list_append(root, create_object(1)); linked_list_prepend(root, create_object(2)); Object* object = (Object*)linked_list_get(root, 0); mu_assert(NULL != object && 2 == object->id, "Cannot get item prepended on list."); return 0; }
void hash_map_put(hash_map *map, void *key, void *value) { linked_list *list = map->table[map->hash_func(key, map->capacity)]; if (!list) { list = (linked_list *) safe_malloc(sizeof(linked_list)); linked_list_init(list, (linked_list_destructor) safe_free); map->table[map->hash_func(key, map->capacity)] = list; } linked_list_node *head = linked_list_head(list); while (head) { hash_map_pair *pair = (hash_map_pair *) head->data; // if key already exists, update the value if (map->comparator(pair->key, key) == 0) { pair->value = value; return; } head = head->next; } // or else insert new one hash_map_pair *pair = (hash_map_pair *) safe_malloc(sizeof(hash_map_pair)); pair->key = key; pair->value = value; linked_list_prepend(list, pair); linked_list_append(map->keys, key); map->size++; }
static char* prv_load(int32_t hashval) { ResHandle locale_handle = resource_get_handle(s_previous_locale); int resource_offset = 0; int locale_entries = 0; resource_offset += resource_load_byte_range(locale_handle, resource_offset, (uint8_t*)&locale_entries, sizeof(locale_entries)); struct locale { int32_t hashval; int32_t strlen; } locale_info; hash_string *s = (hash_string *)malloc(sizeof(hash_string)); s->hashval = hashval; s->value = NULL; linked_list_prepend(s_root, s); for (int i = 0; i < locale_entries; i++) { resource_offset += resource_load_byte_range(locale_handle, resource_offset, (uint8_t*)&locale_info, sizeof(struct locale)); if(locale_info.hashval == hashval){ char *buffer = malloc(locale_info.strlen); resource_load_byte_range(locale_handle, resource_offset, (uint8_t*)buffer, locale_info.strlen); s->value = buffer; break; } else { resource_offset += locale_info.strlen; } } return s->value; }