diff --git a/src/lib/eolian/Eolian.h b/src/lib/eolian/Eolian.h index 270847bf17..3a1e9d6195 100644 --- a/src/lib/eolian/Eolian.h +++ b/src/lib/eolian/Eolian.h @@ -780,6 +780,30 @@ EAPI const Eolian_Type *eolian_type_alias_find_by_name(const char *name); */ EAPI const Eolian_Type *eolian_type_struct_find_by_name(const char *name); +/* + * @brief Get an iterator to all aliases contained in a file. + * + * @param[in] fname the file name without full path + * @return the iterator or NULL + * + * Thanks to internal caching, this is an O(1) operation. + * + * @ingroup Eolian + */ +EAPI Eina_Iterator *eolian_type_aliases_get_by_file(const char *fname); + +/* + * @brief Get an iterator to all named structs contained in a file. + * + * @param[in] fname the file name without full path + * @return the iterator or NULL + * + * Thanks to internal caching, this is an O(1) operation. + * + * @ingroup Eolian + */ +EAPI Eina_Iterator *eolian_type_structs_get_by_file(const char *fname); + /* * @brief Get the type of a type (regular, function, pointer) * diff --git a/src/lib/eolian/database_type.c b/src/lib/eolian/database_type.c index 932af02de8..a0ea20ea78 100644 --- a/src/lib/eolian/database_type.c +++ b/src/lib/eolian/database_type.c @@ -38,6 +38,8 @@ database_type_add(Eolian_Type *def) { if (!_aliases) return EINA_FALSE; eina_hash_set(_aliases, def->full_name, def); + eina_hash_set(_aliasesf, def->file, eina_list_append + ((Eina_List*)eina_hash_find(_aliasesf, def->file), def)); return EINA_TRUE; } @@ -45,6 +47,8 @@ Eina_Bool database_struct_add(Eolian_Type *tp) { if (!_structs) return EINA_FALSE; eina_hash_set(_structs, tp->full_name, tp); + eina_hash_set(_structsf, tp->file, eina_list_append + ((Eina_List*)eina_hash_find(_structsf, tp->file), tp)); return EINA_TRUE; } diff --git a/src/lib/eolian/database_type_api.c b/src/lib/eolian/database_type_api.c index ba9cd47e37..308c7282e4 100644 --- a/src/lib/eolian/database_type_api.c +++ b/src/lib/eolian/database_type_api.c @@ -22,6 +22,28 @@ eolian_type_struct_find_by_name(const char *name) return tp; } +EAPI Eina_Iterator * +eolian_type_aliases_get_by_file(const char *fname) +{ + if (!_aliasesf) return NULL; + Eina_Stringshare *shr = eina_stringshare_add(fname); + Eina_List *l = eina_hash_find(_aliasesf, shr); + eina_stringshare_del(shr); + if (!l) return NULL; + return eina_list_iterator_new(l); +} + +EAPI Eina_Iterator * +eolian_type_structs_get_by_file(const char *fname) +{ + if (!_structsf) return NULL; + Eina_Stringshare *shr = eina_stringshare_add(fname); + Eina_List *l = eina_hash_find(_structsf, shr); + eina_stringshare_del(shr); + if (!l) return NULL; + return eina_list_iterator_new(l); +} + EAPI Eolian_Type_Type eolian_type_type_get(const Eolian_Type *tp) { diff --git a/src/lib/eolian/eolian_database.c b/src/lib/eolian/eolian_database.c index 958c5f18d8..9938ed4c0f 100644 --- a/src/lib/eolian/eolian_database.c +++ b/src/lib/eolian/eolian_database.c @@ -5,11 +5,19 @@ Eina_List *_classes = NULL; Eina_Hash *_aliases = NULL; Eina_Hash *_structs = NULL; +Eina_Hash *_aliasesf = NULL; +Eina_Hash *_structsf = NULL; Eina_Hash *_filenames = NULL; Eina_Hash *_tfilenames = NULL; static int _database_init_count = 0; +static void +_hashlist_free(void *data) +{ + eina_list_free((Eina_List*)data); +} + int database_init() { @@ -17,6 +25,8 @@ database_init() eina_init(); _aliases = eina_hash_stringshared_new(EINA_FREE_CB(database_typedef_del)); _structs = eina_hash_stringshared_new(EINA_FREE_CB(database_type_del)); + _aliasesf = eina_hash_stringshared_new(_hashlist_free); + _structsf = eina_hash_stringshared_new(_hashlist_free); _filenames = eina_hash_string_small_new(free); _tfilenames = eina_hash_string_small_new(free); return ++_database_init_count; @@ -39,6 +49,8 @@ database_shutdown() database_class_del(class); eina_hash_free(_aliases); eina_hash_free(_structs); + eina_hash_free(_aliasesf); + eina_hash_free(_structsf); eina_hash_free(_filenames); eina_hash_free(_tfilenames); eina_shutdown(); diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h index ac379a819f..1f29a1da88 100644 --- a/src/lib/eolian/eolian_database.h +++ b/src/lib/eolian/eolian_database.h @@ -42,6 +42,8 @@ extern Eina_Prefix *_eolian_prefix; extern Eina_List *_classes; extern Eina_Hash *_aliases; extern Eina_Hash *_structs; +extern Eina_Hash *_aliasesf; +extern Eina_Hash *_structsf; extern Eina_Hash *_filenames; /* Hash: filename without extension -> full path */ extern Eina_Hash *_tfilenames; diff --git a/src/tests/eolian/eolian_parsing.c b/src/tests/eolian/eolian_parsing.c index 2325a74d58..ce1046b2ae 100644 --- a/src/tests/eolian/eolian_parsing.c +++ b/src/tests/eolian/eolian_parsing.c @@ -275,6 +275,18 @@ START_TEST(eolian_typedef) eina_stringshare_del(type_name); eina_iterator_free(iter); + /* List */ + fail_if(!(iter = eolian_type_aliases_get_by_file("typedef.eo"))); + fail_if(!eina_iterator_next(iter, (void**)&atype)); + fail_if(!(type_name = eolian_type_name_get(atype))); + fail_if(strcmp(type_name, "Coord")); + eina_stringshare_del(type_name); + fail_if(!eina_iterator_next(iter, (void**)&atype)); + fail_if(!(type_name = eolian_type_name_get(atype))); + fail_if(strcmp(type_name, "List_Objects")); + eina_stringshare_del(type_name); + fail_if(eina_iterator_next(iter, (void**)&atype)); + eolian_shutdown(); } END_TEST