mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-08-02 07:23:41 +02:00
Merge remote branch 'gvdb/master'
This commit is contained in:
@@ -230,7 +230,7 @@ gvdb_table_check_name (GvdbTable *file,
|
||||
return FALSE;
|
||||
|
||||
parent = guint32_from_le (item->parent);
|
||||
if (key_length == 0 && parent == -1)
|
||||
if (key_length == 0 && parent == 0xffffffffu)
|
||||
return TRUE;
|
||||
|
||||
if G_LIKELY (parent < file->n_hash_items && this_size > 0)
|
||||
@@ -340,7 +340,7 @@ gvdb_table_list (GvdbTable *file,
|
||||
const guint32_le *list;
|
||||
gchar **strv;
|
||||
guint length;
|
||||
gint i;
|
||||
guint i;
|
||||
|
||||
if ((item = gvdb_table_lookup (file, key, 'L')) == NULL)
|
||||
return NULL;
|
||||
@@ -574,6 +574,30 @@ gvdb_table_is_valid (GvdbTable *table)
|
||||
return !!*table->data;
|
||||
}
|
||||
|
||||
/**
|
||||
* gvdb_table_walk:
|
||||
* @table: a #GvdbTable
|
||||
* @key: a key corresponding to a list
|
||||
* @open_func: the #GvdbWalkOpenFunc
|
||||
* @value_func: the #GvdbWalkValueFunc
|
||||
* @close_func: the #GvdbWalkCloseFunc
|
||||
* @user_data: data to pass to the callbacks
|
||||
*
|
||||
* Looks up the list at @key and iterate over the items in it.
|
||||
*
|
||||
* First, @open_func is called to signal that we are starting to iterate over
|
||||
* the list. Then the list is iterated. When all items in the list have been
|
||||
* iterated over, the @close_func is called.
|
||||
*
|
||||
* When iterating, if a given item in the list is a value then @value_func is
|
||||
* called.
|
||||
*
|
||||
* If a given item in the list is itself a list then @open_func is called. If
|
||||
* that function returns %TRUE then the walk begins iterating the items in the
|
||||
* sublist, until there are no more items, at which point a matching
|
||||
* @close_func call is made. If @open_func returns %FALSE then no iteration of
|
||||
* the sublist occurs and no corresponding @close_func call is made.
|
||||
**/
|
||||
void
|
||||
gvdb_table_walk (GvdbTable *table,
|
||||
const gchar *key,
|
||||
@@ -585,16 +609,18 @@ gvdb_table_walk (GvdbTable *table,
|
||||
const struct gvdb_hash_item *item;
|
||||
const guint32_le *pointers[64];
|
||||
const guint32_le *enders[64];
|
||||
gsize name_lengths[64];
|
||||
gint index = 0;
|
||||
|
||||
item = gvdb_table_lookup (table, key, 'L');
|
||||
name_lengths[0] = 0;
|
||||
pointers[0] = NULL;
|
||||
enders[0] = NULL;
|
||||
goto start_here;
|
||||
|
||||
while (index)
|
||||
{
|
||||
close_func (user_data);
|
||||
close_func (name_lengths[index], user_data);
|
||||
index--;
|
||||
|
||||
while (pointers[index] < enders[index])
|
||||
@@ -621,6 +647,7 @@ gvdb_table_walk (GvdbTable *table,
|
||||
&pointers[index],
|
||||
&length);
|
||||
enders[index] = pointers[index] + length;
|
||||
name_lengths[index] = name_len;
|
||||
}
|
||||
}
|
||||
else if (item->type == 'v')
|
||||
|
Reference in New Issue
Block a user