int offset;
int text_offset;
gboolean include_len;
+ GList link;
} RecordDataString;
typedef struct {
typedef struct {
GHashTable *strings;
GStringChunk *chunks;
+ GQueue string_list;
RecordDataElement *root;
RecordDataElement *current;
} RecordData;
static int
record_data_string_compare (gconstpointer _a,
- gconstpointer _b)
+ gconstpointer _b,
+ gpointer user_data)
{
const RecordDataString *a = _a;
const RecordDataString *b = _b;
s->len = len;
s->count = 1;
s->include_len = include_len;
+ s->link.data = s;
+ s->link.next = NULL;
+ s->link.prev = NULL;
g_hash_table_add (data->strings, s);
+ g_queue_push_tail_link (&data->string_list, &s->link);
return s;
}
{
GMarkupParseContext *ctx;
RecordData data = { 0 };
- GList *string_table, *l;
+ GList *l;
GString *marshaled;
int offset;
g_markup_parse_context_free (ctx);
- string_table = g_hash_table_get_values (data.strings);
- string_table = g_list_sort (string_table, record_data_string_compare);
+ g_queue_sort (&data.string_list, record_data_string_compare, NULL);
offset = 0;
- for (l = string_table; l != NULL; l = l->next)
+ for (l = data.string_list.head; l != NULL; l = l->next)
{
RecordDataString *s = l->data;
g_string_append_len (marshaled, "GBU\0", 4);
marshal_uint32 (marshaled, offset);
- for (l = string_table; l != NULL; l = l->next)
+ for (l = data.string_list.head; l != NULL; l = l->next)
{
RecordDataString *s = l->data;
g_string_append_len (marshaled, s->string, s->len + 1);
}
- g_list_free (string_table);
-
marshal_tree (marshaled, &data.root->base);
record_data_node_free (&data.root->base);