Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <glib.h>
- 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;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement