RECORD_TYPE_TEXT,
} RecordTreeType;
+typedef struct {
+ char *string;
+ int count;
+ int offset;
+} RecordDataString;
+
typedef struct RecordDataTree RecordDataTree;
/* All strings are owned by the string table */
RecordDataTree *parent;
RecordTreeType type;
int n_attributes;
- const char *data;
- const char **attributes;
- const char **values;
+ RecordDataString *data;
+ RecordDataString **attributes;
+ RecordDataString **values;
GList *children;
};
-typedef struct {
- char *string;
- int count;
- int offset;
-} RecordDataString;
-
static RecordDataTree *
-record_data_tree_new (RecordDataTree *parent,
- RecordTreeType type,
- const char *data)
+record_data_tree_new (RecordDataTree *parent,
+ RecordTreeType type,
+ RecordDataString *data)
{
RecordDataTree *tree = g_slice_new0 (RecordDataTree);
g_slice_free (RecordDataString, s);
}
-static const char *
+static RecordDataString *
record_data_string_lookup (GHashTable *strings,
const char *str,
gssize len)
{
g_free (copy);
s->count++;
- return s->string;
+ return s;
}
s = g_slice_new (RecordDataString);
s->count = 1;
g_hash_table_insert (strings, s->string, s);
- return s->string;
+ return s;
}
typedef struct {
data->current = child;
child->n_attributes = n_attrs;
- child->attributes = g_new (const char *, n_attrs);
- child->values = g_new (const char *, n_attrs);
+ child->attributes = g_new (RecordDataString *, n_attrs);
+ child->values = g_new (RecordDataString *, n_attrs);
for (i = 0; i < n_attrs; i++)
{
}
}
-static void
-marshal_string (GString *marshaled,
- GHashTable *strings,
- const char *string)
-{
- RecordDataString *s;
-
- s = g_hash_table_lookup (strings, string);
- g_assert (s != NULL);
-
- marshal_uint32 (marshaled, s->offset);
-}
-
static void
marshal_tree (GString *marshaled,
- GHashTable *strings,
RecordDataTree *tree)
{
GList *l;
if (tree->parent == NULL)
{
for (l = g_list_last (tree->children); l != NULL; l = l->prev)
- marshal_tree (marshaled, strings, l->data);
+ marshal_tree (marshaled, l->data);
return;
}
{
case RECORD_TYPE_ELEMENT:
marshal_uint32 (marshaled, RECORD_TYPE_ELEMENT);
- marshal_string (marshaled, strings, tree->data);
+ marshal_uint32 (marshaled, tree->data->offset);
marshal_uint32 (marshaled, tree->n_attributes);
for (i = 0; i < tree->n_attributes; i++)
{
- marshal_string (marshaled, strings, tree->attributes[i]);
- marshal_string (marshaled, strings, tree->values[i]);
+ marshal_uint32 (marshaled, tree->attributes[i]->offset);
+ marshal_uint32 (marshaled, tree->values[i]->offset);
}
for (l = g_list_last (tree->children); l != NULL; l = l->prev)
- marshal_tree (marshaled, strings, l->data);
+ marshal_tree (marshaled, l->data);
marshal_uint32 (marshaled, RECORD_TYPE_END_ELEMENT);
break;
case RECORD_TYPE_TEXT:
marshal_uint32 (marshaled, RECORD_TYPE_TEXT);
- marshal_string (marshaled, strings, tree->data);
+ marshal_uint32 (marshaled, tree->data->offset);
break;
case RECORD_TYPE_END_ELEMENT:
default:
g_list_free (string_table);
- marshal_tree (marshaled, data.strings, data.root);
+ marshal_tree (marshaled, data.root);
record_data_tree_free (data.root);
g_hash_table_destroy (data.strings);