diff options
author | Matthias Clasen <mclasen@redhat.com> | 2021-07-07 09:56:34 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2021-07-13 22:02:33 -0400 |
commit | bee58fd09daa4deaebb51f8f123e1b7789e37b8c (patch) | |
tree | 0112c3ed024275f31ddaab76fbe6da661d4a625b | |
parent | d25557a5ef346e3b1a4dead8f71f19706f151335 (diff) | |
download | gtk+-bee58fd09daa4deaebb51f8f123e1b7789e37b8c.tar.gz |
composetable: Introduce a parser struct
This will be used in the following commits to
beef up Compose file parsing.
-rw-r--r-- | gtk/gtkcomposetable.c | 62 |
1 files changed, 42 insertions, 20 deletions
diff --git a/gtk/gtkcomposetable.c b/gtk/gtkcomposetable.c index 3e8b663860..f053ce8741 100644 --- a/gtk/gtkcomposetable.c +++ b/gtk/gtkcomposetable.c @@ -39,7 +39,6 @@ typedef struct { char *value; } GtkComposeData; - static void gtk_compose_data_free (GtkComposeData *compose_data) { @@ -48,10 +47,27 @@ gtk_compose_data_free (GtkComposeData *compose_data) g_slice_free (GtkComposeData, compose_data); } +typedef struct { + GList *sequences; +} GtkComposeParser; + +static GtkComposeParser * +parser_new (void) +{ + GtkComposeParser *parser; + + parser = g_new (GtkComposeParser, 1); + + parser->sequences = NULL; + + return parser; +} + static void -gtk_compose_list_element_free (GtkComposeData *compose_data, gpointer data) +parser_free (GtkComposeParser *parser) { - gtk_compose_data_free (compose_data); + g_list_free_full (parser->sequences, (GDestroyNotify) gtk_compose_data_free); + g_free (parser); } static gboolean @@ -784,43 +800,49 @@ gtk_compose_table_new_with_list (GList *compose_list, GtkComposeTable * gtk_compose_table_new_with_file (const char *compose_file) { - GList *compose_list = NULL; + GtkComposeParser *parser; GtkComposeTable *compose_table; int max_compose_len = 0; int n_index_stride = 0; g_assert (compose_file != NULL); + compose_table = NULL; + compose_table = gtk_compose_table_load_cache (compose_file); if (compose_table != NULL) return compose_table; - compose_list = gtk_compose_list_parse_file (compose_file); - if (compose_list == NULL) - return NULL; - compose_list = gtk_compose_list_check_duplicated (compose_list); - compose_list = gtk_compose_list_check_uint16 (compose_list); - compose_list = gtk_compose_list_format_for_gtk (compose_list, - &max_compose_len, - &n_index_stride); - compose_list = g_list_sort_with_data (compose_list, - (GCompareDataFunc) gtk_compose_data_compare, - GINT_TO_POINTER (max_compose_len)); - if (compose_list == NULL) + parser = parser_new (); + + parser->sequences = gtk_compose_list_parse_file (compose_file); + if (parser->sequences == NULL) + goto out; + + parser->sequences = gtk_compose_list_check_duplicated (parser->sequences); + parser->sequences = gtk_compose_list_check_uint16 (parser->sequences); + parser->sequences = gtk_compose_list_format_for_gtk (parser->sequences, + &max_compose_len, + &n_index_stride); + parser->sequences = g_list_sort_with_data (parser->sequences, + (GCompareDataFunc) gtk_compose_data_compare, + GINT_TO_POINTER (max_compose_len)); + if (parser->sequences == NULL) { g_warning ("compose file %s does not include any keys besides keys in en-us compose file", compose_file); - return NULL; + goto out; } - compose_table = gtk_compose_table_new_with_list (compose_list, + compose_table = gtk_compose_table_new_with_list (parser->sequences, max_compose_len, n_index_stride, g_str_hash (compose_file)); - g_list_free_full (compose_list, (GDestroyNotify) gtk_compose_list_element_free); - gtk_compose_table_save_cache (compose_table); +out: + parser_free (parser); + return compose_table; } |