eolian: new API: eolian_type_structs/aliases_get_by_file

This commit is contained in:
Daniel Kolesa 2014-07-22 13:14:44 +01:00
parent b0788a546b
commit 89ca97aceb
6 changed files with 76 additions and 0 deletions

View File

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

View File

@ -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;
}

View File

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

View File

@ -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();

View File

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

View File

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