diff options
author | Cedric BAIL <cedric.bail@free.fr> | 2012-10-31 05:55:53 +0000 |
---|---|---|
committer | Cedric BAIL <cedric.bail@free.fr> | 2012-10-31 05:55:53 +0000 |
commit | 87b2de8a2160ed48e5a267b3954755d0c04ceec5 (patch) | |
tree | f61863e934535244820841c96688559ca3e3b57f /src/lib/eet_lib.c | |
parent | 0fa23ebd7cde199146cf72a89beafd8078651773 (diff) | |
download | eet-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.c | 116 |
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) |