Advertisement
Marrin

Common tokens.

Jul 12th, 2013
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.72 KB | None | 0 0
  1. #include <glib.h>
  2.  
  3.  
  4. GHashTable* read_word_file(const gchar *filename, GError **error)
  5. {
  6.     GIOChannel *word_file;
  7.     GHashTable *result;
  8.     gchar *word;
  9.  
  10.     if ((word_file = g_io_channel_new_file(filename, "r", error)) == NULL) {
  11.         return NULL;
  12.     }
  13.     result = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
  14.     while (
  15.         g_io_channel_read_line(word_file, &word, NULL, NULL, NULL)
  16.             == G_IO_STATUS_NORMAL
  17.     ) {
  18.         g_hash_table_add(result, g_strstrip(word));
  19.     }
  20.     if (*error != NULL) {
  21.         g_hash_table_unref(result);
  22.         result = NULL;
  23.     }
  24.     g_io_channel_unref(word_file);
  25.     return result;      
  26. }
  27.  
  28. void intersection(GHashTable *set_a, GHashTable *set_b)
  29. {
  30.     GHashTableIter iterator;
  31.     gchar *word;
  32.  
  33.     g_hash_table_iter_init(&iterator, set_a);
  34.     while (g_hash_table_iter_next(&iterator, (gpointer*) &word, NULL)) {
  35.         if (!g_hash_table_lookup_extended(set_b, word, NULL, NULL)) {
  36.             g_hash_table_iter_remove(&iterator);
  37.         }
  38.     }
  39. }
  40.  
  41. gint compare_caseless(const gchar** a, const gchar** b)
  42. {
  43.     gint result;
  44.     gchar *tmp_a, *tmp_b;
  45.  
  46.     tmp_a = g_utf8_casefold(*a, -1);
  47.     tmp_b = g_utf8_casefold(*b, -1);
  48.     result = g_strcmp0(tmp_a, tmp_b);
  49.    
  50.     g_free(tmp_a);
  51.     g_free(tmp_b);
  52.     return result;
  53. }
  54.  
  55. void print_result(GHashTable *set)
  56. {  
  57.     GPtrArray *words;
  58.     GHashTableIter iterator;
  59.     gchar *word, *line;
  60.  
  61.     words = g_ptr_array_sized_new(g_hash_table_size(set) + 1);
  62.  
  63.     g_hash_table_iter_init(&iterator, set);
  64.     while (g_hash_table_iter_next(&iterator, (gpointer*) &word, NULL)) {
  65.         g_ptr_array_add(words, word);
  66.     }
  67.     g_ptr_array_sort(words, (GCompareFunc) compare_caseless);
  68.     g_ptr_array_add(words, NULL);
  69.     line = g_strjoinv(", ", (char**) words->pdata);
  70.     g_print("%s\n", line);
  71.  
  72.     g_free(line);
  73.     g_ptr_array_unref(words);
  74. }
  75.  
  76. int main(gint argc, gchar **argv)
  77. {
  78.     gint i;
  79.     GHashTable *result, *word_set;
  80.     GError *error = NULL;
  81.  
  82.     if (argc == 1) return 0;
  83.  
  84.     if ((result = read_word_file(argv[1], &error)) == NULL) {
  85.         g_print("Problem reading '%s': %s\n", argv[1], error->message);
  86.         g_error_free(error);
  87.         return 1;  
  88.     }
  89.  
  90.     for (i = 2; i < argc; i++) {
  91.         if ((word_set = read_word_file(argv[i], &error)) == NULL) {
  92.             g_print("Problem reading '%s': %s\n", argv[i], error->message);
  93.             g_error_free(error);
  94.             g_hash_table_unref(result);
  95.             return 1;
  96.         } else {
  97.             intersection(result, word_set);
  98.             g_hash_table_unref(word_set);
  99.         }
  100.     }
  101.  
  102.     print_result(result);
  103.  
  104.     g_hash_table_unref(result);
  105.     return 0;
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement