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,
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])
&pointers[index],
&length);
enders[index] = pointers[index] + length;
+ name_lengths[index] = name_len;
}
}
else if (item->type == 'v')
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,