summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2021-02-02 01:42:08 -0500
committerMatthias Clasen <mclasen@redhat.com>2021-02-02 11:55:00 -0500
commit676f875bf6d39c2683491ed980cd50c6646b022b (patch)
tree60b36dcf1cd4bbd3c0fa0d45f86ea97da39d58de
parent140c5c533338ff4dc2c51ff7ddd90f5f860f88e6 (diff)
downloadgtk+-676f875bf6d39c2683491ed980cd50c6646b022b.tar.gz
composetable: Support string values in the cache
Change the cache format to include the character data that we need to hold string values in the table.
-rw-r--r--gtk/gtkcomposetable.c86
1 files changed, 39 insertions, 47 deletions
diff --git a/gtk/gtkcomposetable.c b/gtk/gtkcomposetable.c
index cfb51e6e81..a4c91abd90 100644
--- a/gtk/gtkcomposetable.c
+++ b/gtk/gtkcomposetable.c
@@ -28,7 +28,7 @@
#define GTK_COMPOSE_TABLE_MAGIC "GtkComposeTable"
-#define GTK_COMPOSE_TABLE_VERSION (1)
+#define GTK_COMPOSE_TABLE_VERSION (2)
/* Maximum length of sequences we parse */
@@ -496,6 +496,7 @@ gtk_compose_table_serialize (GtkComposeTable *compose_table,
guint16 max_seq_len = compose_table->max_seq_len;
guint16 index_stride = max_seq_len + 2;
guint16 n_seqs = compose_table->n_seqs;
+ guint16 n_chars = compose_table->n_chars;
guint32 i;
g_return_val_if_fail (compose_table != NULL, NULL);
@@ -503,7 +504,7 @@ gtk_compose_table_serialize (GtkComposeTable *compose_table,
g_return_val_if_fail (index_stride > 0, NULL);
length = strlen (header);
- total_length = length + sizeof (guint16) * (3 + index_stride * n_seqs);
+ total_length = length + sizeof (guint16) * (4 + index_stride * n_seqs) + n_chars;
if (count)
*count = total_length;
@@ -512,35 +513,25 @@ gtk_compose_table_serialize (GtkComposeTable *compose_table,
memcpy (p, header, length);
p += length;
- /* Copy by byte for endian */
-#define BYTE_COPY_FROM_BUF(element) \
- bytes = GUINT16_TO_BE ((element)); \
- memcpy (p, &bytes, length); \
- p += length; \
- if (p - contents > total_length) \
- { \
- g_warning ("data size %lld is bigger than %" G_GSIZE_FORMAT, \
- (long long) (p - contents), total_length); \
- g_free (contents); \
- if (count) \
- { \
- *count = 0; \
- } \
- return NULL; \
- }
-
- length = sizeof (guint16);
+#define APPEND_GUINT16(elt) \
+ bytes = GUINT16_TO_BE (elt); \
+ memcpy (p, &bytes, sizeof (guint16)); \
+ p += sizeof (guint16);
- BYTE_COPY_FROM_BUF (version);
- BYTE_COPY_FROM_BUF (max_seq_len);
- BYTE_COPY_FROM_BUF (n_seqs);
+ APPEND_GUINT16 (version);
+ APPEND_GUINT16 (max_seq_len);
+ APPEND_GUINT16 (n_seqs);
+ APPEND_GUINT16 (n_chars);
for (i = 0; i < (guint32) index_stride * n_seqs; i++)
{
- BYTE_COPY_FROM_BUF (compose_table->data[i]);
+ APPEND_GUINT16 (compose_table->data[i]);
}
-#undef BYTE_COPY_FROM_BUF
+ if (compose_table->n_chars > 0)
+ memcpy (p, compose_table->char_data, compose_table->n_chars);
+
+#undef APPEND_GUINT16
return contents;
}
@@ -564,16 +555,17 @@ gtk_compose_table_load_cache (const char *compose_file)
GStatBuf original_buf;
GStatBuf cache_buf;
gsize total_length;
- gsize length;
GError *error = NULL;
guint16 bytes;
guint16 version;
guint16 max_seq_len;
guint16 index_stride;
guint16 n_seqs;
+ guint16 n_chars;
guint32 i;
guint16 *gtk_compose_seqs = NULL;
GtkComposeTable *retval;
+ char *char_data = NULL;
hash = g_str_hash (compose_file);
if ((path = gtk_compose_hash_get_cache_path (hash)) == NULL)
@@ -592,16 +584,10 @@ gtk_compose_table_load_cache (const char *compose_file)
goto out_load_cache;
}
- /* Copy by byte for endian */
-#define BYTE_COPY_TO_BUF(element) \
- memcpy (&bytes, p, length); \
- element = GUINT16_FROM_BE (bytes); \
- p += length; \
- if (p - contents > total_length) \
- { \
- g_warning ("Broken cache content %s in %s", path, #element); \
- goto out_load_cache; \
- }
+#define GET_GUINT16(elt) \
+ memcpy (&bytes, p, sizeof (guint16)); \
+ elt = GUINT16_FROM_BE (bytes); \
+ p += sizeof (guint16);
p = contents;
if (g_ascii_strncasecmp (p, GTK_COMPOSE_TABLE_MAGIC,
@@ -610,6 +596,7 @@ gtk_compose_table_load_cache (const char *compose_file)
g_warning ("The file is not a GtkComposeTable cache file %s", path);
goto out_load_cache;
}
+
p += strlen (GTK_COMPOSE_TABLE_MAGIC);
if (p - contents > total_length)
{
@@ -617,9 +604,7 @@ gtk_compose_table_load_cache (const char *compose_file)
goto out_load_cache;
}
- length = sizeof (guint16);
-
- BYTE_COPY_TO_BUF (version);
+ GET_GUINT16 (version);
if (version != GTK_COMPOSE_TABLE_VERSION)
{
g_warning ("cache version is different %u != %u",
@@ -627,8 +612,9 @@ gtk_compose_table_load_cache (const char *compose_file)
goto out_load_cache;
}
- BYTE_COPY_TO_BUF (max_seq_len);
- BYTE_COPY_TO_BUF (n_seqs);
+ GET_GUINT16 (max_seq_len);
+ GET_GUINT16 (n_seqs);
+ GET_GUINT16 (n_chars);
if (max_seq_len == 0 || n_seqs == 0)
{
@@ -641,13 +627,22 @@ gtk_compose_table_load_cache (const char *compose_file)
for (i = 0; i < (guint32) index_stride * n_seqs; i++)
{
- BYTE_COPY_TO_BUF (gtk_compose_seqs[i]);
+ GET_GUINT16 (gtk_compose_seqs[i]);
+ }
+
+ if (n_chars > 0)
+ {
+ char_data = g_new (char, n_chars + 1);
+ memcpy (char_data, p, n_chars);
+ char_data[n_chars] = '\0';
}
retval = g_new0 (GtkComposeTable, 1);
retval->data = gtk_compose_seqs;
retval->max_seq_len = max_seq_len;
retval->n_seqs = n_seqs;
+ retval->char_data = char_data;
+ retval->n_chars = n_chars;
retval->id = hash;
g_free (contents);
@@ -655,10 +650,11 @@ gtk_compose_table_load_cache (const char *compose_file)
return retval;
-#undef BYTE_COPY_TO_BUF
+#undef GET_GUINT16
out_load_cache:
g_free (gtk_compose_seqs);
+ g_free (char_data);
g_free (contents);
g_free (path);
return NULL;
@@ -853,18 +849,14 @@ gtk_compose_table_list_add_file (GSList *compose_tables,
if (g_slist_find_custom (compose_tables, GINT_TO_POINTER (hash), gtk_compose_table_find) != NULL)
return compose_tables;
-#if 0
compose_table = gtk_compose_table_load_cache (compose_file);
if (compose_table != NULL)
return g_slist_prepend (compose_tables, compose_table);
-#endif
if ((compose_table = gtk_compose_table_new_with_file (compose_file)) == NULL)
return compose_tables;
-#if 0
gtk_compose_table_save_cache (compose_table);
-#endif
return g_slist_prepend (compose_tables, compose_table);
}