void tsm_symbol_table_unref(struct tsm_symbol_table *tbl) { if (!tbl || !tbl->ref || --tbl->ref) return; shl_htable_clear(&tbl->symbols, free_ucs4, NULL); shl_array_free(tbl->index); free(tbl); }
SHL_EXPORT void tsm_symbol_table_unref(struct tsm_symbol_table *tbl) { if (!tbl || !tbl->ref || --tbl->ref) return; shl_hashtable_free(tbl->symbols); shl_array_free(tbl->index); free(tbl); }
SHL_EXPORT int tsm_symbol_table_new(struct tsm_symbol_table **out) { struct tsm_symbol_table *tbl; int ret; static const uint32_t *val = NULL; /* we need a valid lvalue */ if (!out) return -EINVAL; tbl = malloc(sizeof(*tbl)); if (!tbl) return -ENOMEM; memset(tbl, 0, sizeof(*tbl)); tbl->ref = 1; tbl->next_id = TSM_UCS4_MAX + 2; ret = shl_array_new(&tbl->index, sizeof(uint32_t*), 4); if (ret) goto err_free; /* first entry is not used so add dummy */ shl_array_push(tbl->index, &val); ret = shl_hashtable_new(&tbl->symbols, hash_ucs4, cmp_ucs4, free, NULL); if (ret) goto err_array; *out = tbl; return 0; err_array: shl_array_free(tbl->index); err_free: free(tbl); return ret; }