#include GHashTable* read_word_file(const gchar *filename, GError **error) { GIOChannel *word_file; GHashTable *result; gchar *word; if ((word_file = g_io_channel_new_file(filename, "r", error)) == NULL) { return NULL; } result = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); while ( g_io_channel_read_line(word_file, &word, NULL, NULL, NULL) == G_IO_STATUS_NORMAL ) { g_hash_table_add(result, g_strstrip(word)); } if (*error != NULL) { g_hash_table_unref(result); result = NULL; } g_io_channel_unref(word_file); return result; } void intersection(GHashTable *set_a, GHashTable *set_b) { GHashTableIter iterator; gchar *word; g_hash_table_iter_init(&iterator, set_a); while (g_hash_table_iter_next(&iterator, (gpointer*) &word, NULL)) { if (!g_hash_table_lookup_extended(set_b, word, NULL, NULL)) { g_hash_table_iter_remove(&iterator); } } } gint compare_caseless(const gchar** a, const gchar** b) { gint result; gchar *tmp_a, *tmp_b; tmp_a = g_utf8_casefold(*a, -1); tmp_b = g_utf8_casefold(*b, -1); result = g_strcmp0(tmp_a, tmp_b); g_free(tmp_a); g_free(tmp_b); return result; } void print_result(GHashTable *set) { GPtrArray *words; GHashTableIter iterator; gchar *word, *line; words = g_ptr_array_sized_new(g_hash_table_size(set) + 1); g_hash_table_iter_init(&iterator, set); while (g_hash_table_iter_next(&iterator, (gpointer*) &word, NULL)) { g_ptr_array_add(words, word); } g_ptr_array_sort(words, (GCompareFunc) compare_caseless); g_ptr_array_add(words, NULL); line = g_strjoinv(", ", (char**) words->pdata); g_print("%s\n", line); g_free(line); g_ptr_array_unref(words); } int main(gint argc, gchar **argv) { gint i; GHashTable *result, *word_set; GError *error = NULL; if (argc == 1) return 0; if ((result = read_word_file(argv[1], &error)) == NULL) { g_print("Problem reading '%s': %s\n", argv[1], error->message); g_error_free(error); return 1; } for (i = 2; i < argc; i++) { if ((word_set = read_word_file(argv[i], &error)) == NULL) { g_print("Problem reading '%s': %s\n", argv[i], error->message); g_error_free(error); g_hash_table_unref(result); return 1; } else { intersection(result, word_set); g_hash_table_unref(word_set); } } print_result(result); g_hash_table_unref(result); return 0; }