diff options
Diffstat (limited to 'mixlib')
-rw-r--r-- | mixlib/mix_symbol_table.c | 42 | ||||
-rw-r--r-- | mixlib/mix_symbol_table.h | 9 |
2 files changed, 51 insertions, 0 deletions
diff --git a/mixlib/mix_symbol_table.c b/mixlib/mix_symbol_table.c index 1045886..d59c396 100644 --- a/mixlib/mix_symbol_table.c +++ b/mixlib/mix_symbol_table.c @@ -64,6 +64,48 @@ mix_symbol_table_delete(mix_symbol_table_t *table) g_hash_table_destroy(table); } +/* add/remove symbols from other table */ +static void +add_symbol_(gpointer symbol, gpointer value, gpointer target) +{ + mix_symbol_table_t *t = (mix_symbol_table_t *)target; + gchar *s = (gchar *)symbol; + mix_word_t v = mix_word_new(GPOINTER_TO_UINT(value)); + mix_symbol_table_insert (t, s, v); +} + +static void +remove_symbol_(gpointer symbol, gpointer value, gpointer target) +{ + mix_symbol_table_t *t = (mix_symbol_table_t *)target; + gchar *s = (gchar *)symbol; + mix_symbol_table_remove (t, s); +} + +gboolean +mix_symbol_table_merge_table (mix_symbol_table_t *table, + mix_symbol_table_t *from) +{ + g_return_val_if_fail (table != NULL, FALSE); + if (from != NULL) + { + mix_symbol_table_foreach (from, add_symbol_, table); + } + return TRUE; +} + +gboolean +mix_symbol_table_substract_table (mix_symbol_table_t *table, + mix_symbol_table_t *other) +{ + g_return_val_if_fail (table != NULL, FALSE); + if (other != NULL) + { + mix_symbol_table_foreach (other, remove_symbol_, table); + } + return TRUE; +} + /* Add/remove symbols one by one */ gint diff --git a/mixlib/mix_symbol_table.h b/mixlib/mix_symbol_table.h index da9046f..db48ffd 100644 --- a/mixlib/mix_symbol_table.h +++ b/mixlib/mix_symbol_table.h @@ -47,6 +47,15 @@ mix_symbol_table_new_from_file(FILE *file); extern void mix_symbol_table_delete(mix_symbol_table_t *table); +/* add/remove symbols from other table */ +extern gboolean +mix_symbol_table_merge_table (mix_symbol_table_t *table, + mix_symbol_table_t *from); + +extern gboolean +mix_symbol_table_substract_table (mix_symbol_table_t *table, + mix_symbol_table_t *other); + /* Add/remove symbols one by one */ /* possible outcomes: */ enum { |