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:
Ryan Lortie 2010-12-07 01:06:33 -05:00
parent e5e491c969
commit 814c0fcaaf
2 changed files with 30 additions and 2 deletions

View File

@ -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')

View File

@ -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,