summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2021-07-07 09:56:34 -0400
committerMatthias Clasen <mclasen@redhat.com>2021-07-13 22:02:33 -0400
commitbee58fd09daa4deaebb51f8f123e1b7789e37b8c (patch)
tree0112c3ed024275f31ddaab76fbe6da661d4a625b
parentd25557a5ef346e3b1a4dead8f71f19706f151335 (diff)
downloadgtk+-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.c62
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;
}