summaryrefslogtreecommitdiff
path: root/src/lib/eet_lib.c
diff options
context:
space:
mode:
authorCedric BAIL <cedric.bail@free.fr>2012-10-31 05:55:53 +0000
committerCedric BAIL <cedric.bail@free.fr>2012-10-31 05:55:53 +0000
commit87b2de8a2160ed48e5a267b3954755d0c04ceec5 (patch)
treef61863e934535244820841c96688559ca3e3b57f /src/lib/eet_lib.c
parent0fa23ebd7cde199146cf72a89beafd8078651773 (diff)
downloadeet-87b2de8a2160ed48e5a267b3954755d0c04ceec5.tar.gz
eet: add a more verbose eet -l.
SVN revision: 78689
Diffstat (limited to 'src/lib/eet_lib.c')
-rw-r--r--src/lib/eet_lib.c116
1 files changed, 116 insertions, 0 deletions
diff --git a/src/lib/eet_lib.c b/src/lib/eet_lib.c
index 32b55cf..6ea5647 100644
--- a/src/lib/eet_lib.c
+++ b/src/lib/eet_lib.c
@@ -2675,6 +2675,122 @@ eet_num_entries(Eet_File *ef)
return ret;
}
+typedef struct _Eet_Entries_Iterator Eet_Entries_Iterator;
+struct _Eet_Entries_Iterator
+{
+ Eina_Iterator iterator;
+
+ Eet_File *ef;
+ Eet_File_Node *efn;
+ int index;
+
+ Eet_Entry entry;
+
+ Eina_Bool locked;
+};
+
+Eina_Bool
+_eet_entries_iterator_next(Eet_Entries_Iterator *it, void **data)
+{
+ if (it->efn == NULL)
+ {
+ int num;
+
+ num = (1 << it->ef->header->directory->size);
+
+ do
+ {
+ it->index++;
+
+ if (!(it->index < num))
+ return EINA_FALSE;
+
+ it->efn = it->ef->header->directory->nodes[it->index];
+ }
+ while (!it->efn);
+ }
+
+ /* copy info in public header */
+ it->entry.name = it->efn->name;
+ it->entry.offset = it->efn->offset;
+ it->entry.size = it->efn->size;
+ it->entry.data_size = it->efn->data_size;
+ it->entry.compression = it->efn->compression;
+ it->entry.ciphered = it->efn->ciphered;
+ it->entry.alias = it->efn->alias;
+
+ *data = &it->entry;
+ it->efn = it->efn->next;
+ return EINA_TRUE;
+}
+
+void *
+_eet_entries_iterator_container(Eet_Entries_Iterator *it)
+{
+ return it->ef;
+}
+
+void
+_eet_entries_iterator_free(Eet_Entries_Iterator *it)
+{
+ if (it->locked)
+ {
+ CRIT("Iterator still LOCKED !");
+ UNLOCK_FILE(it->ef);
+ }
+}
+
+Eina_Bool
+_eet_entries_iterator_lock(Eet_Entries_Iterator *it)
+{
+ if (it->locked)
+ {
+ CRIT("Iterator already LOCKED !");
+ return EINA_TRUE;
+ }
+
+ LOCK_FILE(it->ef);
+ it->locked = EINA_TRUE;
+ return EINA_TRUE;
+}
+
+Eina_Bool
+_eet_entries_iterator_unlock(Eet_Entries_Iterator *it)
+{
+ if (!it->locked)
+ {
+ CRIT("Iterator already UNLOCKED !");
+ return EINA_TRUE;
+ }
+
+ UNLOCK_FILE(it->ef);
+ it->locked = EINA_FALSE;
+ return EINA_TRUE;
+}
+
+EAPI Eina_Iterator *
+eet_list_entries(Eet_File *ef)
+{
+ Eet_Entries_Iterator *it;
+
+ it = malloc(sizeof (Eet_Entries_Iterator));
+ if (!it) return NULL;
+
+ EINA_MAGIC_SET(&it->iterator, EINA_MAGIC_ITERATOR);
+ it->ef = ef;
+ it->efn = NULL;
+ it->index = -1;
+ it->locked = EINA_FALSE;
+ it->iterator.version = EINA_ITERATOR_VERSION;
+ it->iterator.next = FUNC_ITERATOR_NEXT(_eet_entries_iterator_next);
+ it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(_eet_entries_iterator_container);
+ it->iterator.free = FUNC_ITERATOR_FREE(_eet_entries_iterator_free);
+ it->iterator.lock = FUNC_ITERATOR_LOCK(_eet_entries_iterator_lock);
+ it->iterator.unlock = FUNC_ITERATOR_LOCK(_eet_entries_iterator_unlock);
+
+ return &it->iterator;
+}
+
static Eet_File_Node *
find_node_by_name(Eet_File *ef,
const char *name)