hash_map* lat_clonar_hash(lat_vm* vm, hash_map* h) { int c = 0; hash_map* ret = make_hash_map(); list_node* l; for (c = 0; c < 256; ++c) { l = h->buckets[c]; if (l != NULL) { ret->buckets[c] = lat_crear_lista(); if (l != NULL) { list_node* cur; for (cur = l->next; cur != NULL; cur = cur->next) { if (cur->data != NULL) { hash_val* hv = (hash_val*)lat_asignar_memoria(sizeof(hash_val)); //vm->memory_usage += sizeof(hash_val); strncpy(hv->key, ((hash_val*)cur->data)->key, 256); hv->val = lat_clonar_objeto(vm, (lat_objeto*)((hash_val*)cur->data)->val); insert_list(ret->buckets[c], hv); } } } } } return ret; }
void set_hash(hash_map *m, char *key, void *val) { hash_val *hv = (hash_val *)lat_asignar_memoria(sizeof(hash_val)); strncpy(hv->key, key, (strlen(key)+1)); hv->val = val; int hk = hash(key); if (m->buckets[hk] == NULL) { m->buckets[hk] = lat_crear_lista(); } else { list_node *c; for (c = m->buckets[hk]; c->next != NULL; c = c->next) { if (c->data != NULL) { if (strcmp(((hash_val *)c->data)->key, key) == 0) { free(c->data); c->data = (void *)hv; return; } } } } insert_list(m->buckets[hk], (void *)hv); }
list_node* lat_clonar_lista(lat_vm* vm, list_node* l) { list_node* ret = lat_crear_lista(); if (l != NULL) { list_node* c; for (c = l->next; c != NULL; c = c->next) { if (c->data != NULL) { insert_list(ret, lat_clonar_objeto(vm, (lat_objeto*)c->data)); } } } return ret; }