mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-01-26 14:06:15 +01:00
Pass name_length to walk close function
For efficiency and safety. This way we don't need to scan backwards for the path separator (trusting that we will find it properly).
This commit is contained in:
parent
e5e491c969
commit
814c0fcaaf
@ -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')
|
||||
|
@ -62,7 +62,8 @@ typedef void (*GvdbWalkValueFunc) (const g
|
||||
typedef gboolean (*GvdbWalkOpenFunc) (const gchar *name,
|
||||
gsize name_len,
|
||||
gpointer user_data);
|
||||
typedef void (*GvdbWalkCloseFunc) (gpointer user_data);
|
||||
typedef void (*GvdbWalkCloseFunc) (gsize name_len,
|
||||
gpointer user_data);
|
||||
|
||||
void gvdb_table_walk (GvdbTable *table,
|
||||
const gchar *key,
|
||||
|
Loading…
Reference in New Issue
Block a user