#include "var-map.h" #include #include #include #include enum ivy_status codegen_var_map_init(struct codegen_var_map *map) { memset(map, 0x0, sizeof *map); map->m_map = fx_hashmap_create(free, free); return IVY_OK; } enum ivy_status codegen_var_map_fini(struct codegen_var_map *map) { fx_hashmap_unref(map->m_map); return IVY_OK; } enum ivy_status codegen_var_map_get( struct codegen_var_map *map, const char *ident, struct codegen_var **out) { fx_hashmap_key key = { .key_data = ident, .key_size = strlen(ident), }; const fx_hashmap_value *value = fx_hashmap_get(map->m_map, &key); if (!value) { return IVY_ERR_NO_ENTRY; } *out = value->value_data; return IVY_OK; } enum ivy_status codegen_var_map_put( struct codegen_var_map *map, const char *ident, const struct codegen_var *var) { fx_hashmap_key key = { .key_data = fx_strdup(ident), .key_size = strlen(ident), }; if (!key.key_data) { return IVY_ERR_NO_MEMORY; } fx_hashmap_value value = { .value_data = malloc(sizeof *var), .value_size = sizeof *var, }; if (!value.value_data) { free((void *)key.key_data); return IVY_ERR_NO_MEMORY; } memcpy(value.value_data, var, sizeof *var); fx_status status = fx_hashmap_put(map->m_map, &key, &value); if (!FX_OK(status)) { free((void *)key.key_data); free(value.value_data); } return ivy_status_from_b_status(status); }