2014-09-23 12:48:16 -07:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include "config.h"
|
|
|
|
#endif
|
|
|
|
|
2014-07-10 05:13:46 -07:00
|
|
|
#include <Eina.h>
|
|
|
|
#include "eolian_database.h"
|
2015-05-12 09:23:42 -07:00
|
|
|
#include "eo_lexer.h"
|
2014-07-10 05:13:46 -07:00
|
|
|
|
|
|
|
EAPI const Eolian_Type *
|
2014-07-23 06:13:21 -07:00
|
|
|
eolian_type_alias_get_by_name(const char *name)
|
2014-07-10 05:13:46 -07:00
|
|
|
{
|
2014-07-21 08:57:45 -07:00
|
|
|
if (!_aliases) return NULL;
|
2014-07-21 09:12:35 -07:00
|
|
|
Eina_Stringshare *shr = eina_stringshare_add(name);
|
|
|
|
Eolian_Type *tp = eina_hash_find(_aliases, shr);
|
2014-07-21 04:03:51 -07:00
|
|
|
eina_stringshare_del(shr);
|
2014-07-21 09:12:35 -07:00
|
|
|
return tp;
|
2014-07-21 04:03:51 -07:00
|
|
|
}
|
2014-07-15 07:33:22 -07:00
|
|
|
|
2014-07-10 05:13:46 -07:00
|
|
|
EAPI const Eolian_Type *
|
2014-07-23 06:13:21 -07:00
|
|
|
eolian_type_struct_get_by_name(const char *name)
|
2014-07-10 05:13:46 -07:00
|
|
|
{
|
|
|
|
if (!_structs) return NULL;
|
|
|
|
Eina_Stringshare *shr = eina_stringshare_add(name);
|
|
|
|
Eolian_Type *tp = eina_hash_find(_structs, shr);
|
|
|
|
eina_stringshare_del(shr);
|
|
|
|
return tp;
|
|
|
|
}
|
|
|
|
|
2014-08-12 06:25:53 -07:00
|
|
|
EAPI const Eolian_Type *
|
|
|
|
eolian_type_enum_get_by_name(const char *name)
|
|
|
|
{
|
|
|
|
if (!_enums) return NULL;
|
|
|
|
Eina_Stringshare *shr = eina_stringshare_add(name);
|
|
|
|
Eolian_Type *tp = eina_hash_find(_enums, shr);
|
|
|
|
eina_stringshare_del(shr);
|
|
|
|
return tp;
|
|
|
|
}
|
|
|
|
|
2014-07-22 05:14:44 -07:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
2014-08-12 06:25:53 -07:00
|
|
|
EAPI Eina_Iterator *
|
|
|
|
eolian_type_enums_get_by_file(const char *fname)
|
|
|
|
{
|
|
|
|
if (!_structsf) return NULL;
|
|
|
|
Eina_Stringshare *shr = eina_stringshare_add(fname);
|
|
|
|
Eina_List *l = eina_hash_find(_enumsf, shr);
|
|
|
|
eina_stringshare_del(shr);
|
|
|
|
if (!l) return NULL;
|
|
|
|
return eina_list_iterator_new(l);
|
|
|
|
}
|
|
|
|
|
2014-07-10 05:13:46 -07:00
|
|
|
EAPI Eolian_Type_Type
|
|
|
|
eolian_type_type_get(const Eolian_Type *tp)
|
|
|
|
{
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(tp, EOLIAN_TYPE_UNKNOWN_TYPE);
|
|
|
|
return tp->type;
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI Eina_Iterator *
|
2014-07-23 06:13:21 -07:00
|
|
|
eolian_type_subtypes_get(const Eolian_Type *tp)
|
2014-07-10 05:13:46 -07:00
|
|
|
{
|
|
|
|
Eolian_Type_Type tpt;
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL);
|
|
|
|
tpt = tp->type;
|
2014-09-08 06:52:49 -07:00
|
|
|
EINA_SAFETY_ON_FALSE_RETURN_VAL(tpt == EOLIAN_TYPE_COMPLEX, NULL);
|
2014-07-10 05:13:46 -07:00
|
|
|
if (!tp->subtypes) return NULL;
|
|
|
|
return eina_list_iterator_new(tp->subtypes);
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI Eina_Iterator *
|
2014-08-22 08:56:41 -07:00
|
|
|
eolian_type_struct_fields_get(const Eolian_Type *tp)
|
2014-07-10 05:13:46 -07:00
|
|
|
{
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL);
|
|
|
|
EINA_SAFETY_ON_FALSE_RETURN_VAL(tp->type == EOLIAN_TYPE_STRUCT, NULL);
|
2014-08-22 08:17:33 -07:00
|
|
|
return eina_list_iterator_new(tp->field_list);
|
2014-07-10 05:13:46 -07:00
|
|
|
}
|
|
|
|
|
2014-08-22 08:56:41 -07:00
|
|
|
EAPI const Eolian_Struct_Type_Field *
|
2014-07-10 05:13:46 -07:00
|
|
|
eolian_type_struct_field_get(const Eolian_Type *tp, const char *field)
|
|
|
|
{
|
2014-08-22 08:56:41 -07:00
|
|
|
Eolian_Struct_Type_Field *sf = NULL;
|
2014-07-10 05:13:46 -07:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL);
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(field, NULL);
|
|
|
|
EINA_SAFETY_ON_FALSE_RETURN_VAL(tp->type == EOLIAN_TYPE_STRUCT, NULL);
|
|
|
|
sf = eina_hash_find(tp->fields, field);
|
|
|
|
if (!sf) return NULL;
|
2014-08-22 08:56:41 -07:00
|
|
|
return sf;
|
2014-07-10 05:13:46 -07:00
|
|
|
}
|
|
|
|
|
2014-07-10 06:04:13 -07:00
|
|
|
EAPI Eina_Stringshare *
|
2014-08-22 08:56:41 -07:00
|
|
|
eolian_type_struct_field_name_get(const Eolian_Struct_Type_Field *fl)
|
2014-07-10 05:13:46 -07:00
|
|
|
{
|
2014-08-22 08:56:41 -07:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(fl, NULL);
|
|
|
|
return fl->name;
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI Eina_Stringshare *
|
|
|
|
eolian_type_struct_field_description_get(const Eolian_Struct_Type_Field *fl)
|
|
|
|
{
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(fl, NULL);
|
|
|
|
return fl->comment;
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI const Eolian_Type *
|
|
|
|
eolian_type_struct_field_type_get(const Eolian_Struct_Type_Field *fl)
|
|
|
|
{
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(fl, NULL);
|
|
|
|
return fl->type;
|
2014-07-10 05:13:46 -07:00
|
|
|
}
|
|
|
|
|
2014-08-12 06:25:53 -07:00
|
|
|
EAPI Eina_Iterator *
|
2014-08-22 08:56:41 -07:00
|
|
|
eolian_type_enum_fields_get(const Eolian_Type *tp)
|
2014-08-12 06:25:53 -07:00
|
|
|
{
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL);
|
|
|
|
EINA_SAFETY_ON_FALSE_RETURN_VAL(tp->type == EOLIAN_TYPE_ENUM, NULL);
|
2014-08-22 08:17:33 -07:00
|
|
|
return eina_list_iterator_new(tp->field_list);
|
2014-08-12 06:25:53 -07:00
|
|
|
}
|
|
|
|
|
2015-05-13 10:10:02 -07:00
|
|
|
EAPI const Eolian_Enum_Type_Field *
|
2014-08-12 06:25:53 -07:00
|
|
|
eolian_type_enum_field_get(const Eolian_Type *tp, const char *field)
|
|
|
|
{
|
2014-08-22 08:56:41 -07:00
|
|
|
Eolian_Enum_Type_Field *ef = NULL;
|
2014-08-12 06:25:53 -07:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL);
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(field, NULL);
|
|
|
|
EINA_SAFETY_ON_FALSE_RETURN_VAL(tp->type == EOLIAN_TYPE_ENUM, NULL);
|
|
|
|
ef = eina_hash_find(tp->fields, field);
|
|
|
|
if (!ef) return NULL;
|
2014-08-22 08:56:41 -07:00
|
|
|
return ef;
|
2014-08-12 06:25:53 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
EAPI Eina_Stringshare *
|
2014-08-22 08:56:41 -07:00
|
|
|
eolian_type_enum_field_name_get(const Eolian_Enum_Type_Field *fl)
|
2014-08-12 06:25:53 -07:00
|
|
|
{
|
2014-08-22 08:56:41 -07:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(fl, NULL);
|
|
|
|
return fl->name;
|
|
|
|
}
|
|
|
|
|
2015-05-12 09:04:54 -07:00
|
|
|
EAPI Eina_Stringshare *
|
|
|
|
eolian_type_enum_field_c_name_get(const Eolian_Enum_Type_Field *fl)
|
|
|
|
{
|
|
|
|
Eina_Stringshare *ret;
|
|
|
|
Eina_Strbuf *buf;
|
2015-05-18 08:37:42 -07:00
|
|
|
char *bufp, *p;
|
2015-05-12 09:04:54 -07:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(fl, NULL);
|
|
|
|
buf = eina_strbuf_new();
|
|
|
|
if (fl->base_enum->legacy)
|
|
|
|
eina_strbuf_append(buf, fl->base_enum->legacy);
|
|
|
|
else
|
|
|
|
eina_strbuf_append(buf, fl->base_enum->full_name);
|
|
|
|
eina_strbuf_append_char(buf, '_');
|
|
|
|
eina_strbuf_append(buf, fl->name);
|
|
|
|
bufp = eina_strbuf_string_steal(buf);
|
|
|
|
eina_strbuf_free(buf);
|
|
|
|
eina_str_toupper(&bufp);
|
2015-05-18 08:37:42 -07:00
|
|
|
while ((p = strchr(bufp, '.'))) *p = '_';
|
2015-05-12 09:04:54 -07:00
|
|
|
ret = eina_stringshare_add(bufp);
|
|
|
|
free(bufp);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2014-08-22 08:56:41 -07:00
|
|
|
EAPI Eina_Stringshare *
|
|
|
|
eolian_type_enum_field_description_get(const Eolian_Enum_Type_Field *fl)
|
|
|
|
{
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(fl, NULL);
|
|
|
|
return fl->comment;
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI const Eolian_Expression *
|
2015-05-13 10:10:02 -07:00
|
|
|
eolian_type_enum_field_value_get(const Eolian_Enum_Type_Field *fl, Eina_Bool force)
|
2014-08-22 08:56:41 -07:00
|
|
|
{
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(fl, NULL);
|
2015-05-13 09:56:18 -07:00
|
|
|
if (!force && !fl->is_public_value) return NULL;
|
2014-08-22 08:56:41 -07:00
|
|
|
return fl->value;
|
2014-08-12 06:25:53 -07:00
|
|
|
}
|
|
|
|
|
2014-08-12 09:24:24 -07:00
|
|
|
EAPI Eina_Stringshare *
|
|
|
|
eolian_type_enum_legacy_prefix_get(const Eolian_Type *tp)
|
|
|
|
{
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL);
|
|
|
|
EINA_SAFETY_ON_FALSE_RETURN_VAL(tp->type == EOLIAN_TYPE_ENUM, NULL);
|
|
|
|
return tp->legacy;
|
|
|
|
}
|
|
|
|
|
2014-07-10 06:04:13 -07:00
|
|
|
EAPI Eina_Stringshare *
|
2014-07-21 06:38:43 -07:00
|
|
|
eolian_type_description_get(const Eolian_Type *tp)
|
2014-07-10 05:13:46 -07:00
|
|
|
{
|
2014-07-21 06:38:43 -07:00
|
|
|
Eolian_Type_Type tpp;
|
2014-07-10 05:13:46 -07:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL);
|
2014-07-21 06:38:43 -07:00
|
|
|
tpp = eolian_type_type_get(tp);
|
|
|
|
EINA_SAFETY_ON_FALSE_RETURN_VAL(tpp != EOLIAN_TYPE_POINTER
|
|
|
|
&& tpp != EOLIAN_TYPE_VOID, NULL);
|
2014-08-18 09:15:50 -07:00
|
|
|
return tp->comment;
|
2014-07-10 05:13:46 -07:00
|
|
|
}
|
|
|
|
|
2014-07-21 04:03:51 -07:00
|
|
|
EAPI Eina_Stringshare *
|
2014-07-21 06:38:43 -07:00
|
|
|
eolian_type_file_get(const Eolian_Type *tp)
|
2014-07-21 04:03:51 -07:00
|
|
|
{
|
2014-07-21 06:38:43 -07:00
|
|
|
Eolian_Type_Type tpp;
|
2014-07-21 04:03:51 -07:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL);
|
2014-07-21 06:38:43 -07:00
|
|
|
tpp = eolian_type_type_get(tp);
|
|
|
|
EINA_SAFETY_ON_FALSE_RETURN_VAL(tpp != EOLIAN_TYPE_POINTER
|
|
|
|
&& tpp != EOLIAN_TYPE_VOID, NULL);
|
2014-08-18 09:15:50 -07:00
|
|
|
return tp->base.file;
|
2014-07-21 04:03:51 -07:00
|
|
|
}
|
|
|
|
|
2014-07-10 05:13:46 -07:00
|
|
|
EAPI const Eolian_Type *
|
|
|
|
eolian_type_base_type_get(const Eolian_Type *tp)
|
|
|
|
{
|
|
|
|
Eolian_Type_Type tpt;
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL);
|
|
|
|
tpt = eolian_type_type_get(tp);
|
2015-05-12 06:27:02 -07:00
|
|
|
EINA_SAFETY_ON_FALSE_RETURN_VAL(tpt == EOLIAN_TYPE_POINTER
|
|
|
|
|| tpt == EOLIAN_TYPE_ALIAS
|
|
|
|
|| tpt == EOLIAN_TYPE_REGULAR, NULL);
|
|
|
|
if (tpt == EOLIAN_TYPE_REGULAR)
|
|
|
|
{
|
|
|
|
/* for regular types, try looking up if it belongs to a struct,
|
|
|
|
* enum or an alias... otherwise return NULL
|
2015-05-12 09:23:42 -07:00
|
|
|
* but first check for builtins
|
2015-05-12 06:27:02 -07:00
|
|
|
*/
|
2015-05-12 09:23:42 -07:00
|
|
|
int kw = eo_lexer_keyword_str_to_id(tp->full_name);
|
|
|
|
if (!kw || kw < KW_byte || kw > KW_list)
|
|
|
|
{
|
2015-05-15 07:16:48 -07:00
|
|
|
Eolian_Declaration *decl = eina_hash_find(_decls, tp->full_name);
|
|
|
|
if (decl && decl->type != EOLIAN_DECL_CLASS
|
|
|
|
&& decl->type != EOLIAN_DECL_VAR)
|
|
|
|
return decl->data;
|
2015-05-12 09:23:42 -07:00
|
|
|
}
|
|
|
|
return NULL;
|
2015-05-12 06:27:02 -07:00
|
|
|
}
|
2014-07-10 05:13:46 -07:00
|
|
|
return tp->base_type;
|
|
|
|
}
|
|
|
|
|
2014-07-30 03:57:11 -07:00
|
|
|
EAPI const Eolian_Class *
|
|
|
|
eolian_type_class_get(const Eolian_Type *tp)
|
|
|
|
{
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL);
|
|
|
|
EINA_SAFETY_ON_FALSE_RETURN_VAL(eolian_type_type_get(tp) == EOLIAN_TYPE_CLASS, NULL);
|
|
|
|
return eolian_class_get_by_name(tp->full_name);
|
|
|
|
}
|
|
|
|
|
2014-07-10 05:13:46 -07:00
|
|
|
EAPI Eina_Bool
|
|
|
|
eolian_type_is_own(const Eolian_Type *tp)
|
|
|
|
{
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(tp, EINA_FALSE);
|
|
|
|
return tp->is_own;
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI Eina_Bool
|
|
|
|
eolian_type_is_const(const Eolian_Type *tp)
|
|
|
|
{
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(tp, EINA_FALSE);
|
|
|
|
return tp->is_const;
|
|
|
|
}
|
|
|
|
|
2014-07-15 07:33:22 -07:00
|
|
|
EAPI Eina_Bool
|
2014-07-21 06:14:22 -07:00
|
|
|
eolian_type_is_extern(const Eolian_Type *tp)
|
2014-07-15 07:33:22 -07:00
|
|
|
{
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(tp, EINA_FALSE);
|
|
|
|
return tp->is_extern;
|
|
|
|
}
|
|
|
|
|
2014-07-10 05:13:46 -07:00
|
|
|
EAPI Eina_Stringshare *
|
|
|
|
eolian_type_c_type_named_get(const Eolian_Type *tp, const char *name)
|
|
|
|
{
|
|
|
|
Eina_Stringshare *ret;
|
|
|
|
Eina_Strbuf *buf;
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL);
|
|
|
|
buf = eina_strbuf_new();
|
|
|
|
database_type_to_str(tp, buf, name);
|
|
|
|
ret = eina_stringshare_add(eina_strbuf_string_get(buf));
|
|
|
|
eina_strbuf_free(buf);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI Eina_Stringshare *
|
|
|
|
eolian_type_c_type_get(const Eolian_Type *tp)
|
|
|
|
{
|
|
|
|
return eolian_type_c_type_named_get(tp, NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI Eina_Stringshare *
|
|
|
|
eolian_type_name_get(const Eolian_Type *tp)
|
|
|
|
{
|
2014-07-21 06:27:23 -07:00
|
|
|
Eolian_Type_Type tpp;
|
2014-07-10 05:13:46 -07:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL);
|
2014-07-21 06:27:23 -07:00
|
|
|
tpp = eolian_type_type_get(tp);
|
|
|
|
EINA_SAFETY_ON_FALSE_RETURN_VAL(tpp != EOLIAN_TYPE_POINTER
|
|
|
|
&& tpp != EOLIAN_TYPE_VOID, NULL);
|
2014-08-18 09:15:50 -07:00
|
|
|
return tp->name;
|
2014-07-21 06:27:23 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
EAPI Eina_Stringshare *
|
|
|
|
eolian_type_full_name_get(const Eolian_Type *tp)
|
|
|
|
{
|
|
|
|
Eolian_Type_Type tpp;
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL);
|
|
|
|
tpp = eolian_type_type_get(tp);
|
|
|
|
EINA_SAFETY_ON_FALSE_RETURN_VAL(tpp != EOLIAN_TYPE_POINTER
|
|
|
|
&& tpp != EOLIAN_TYPE_VOID, NULL);
|
2014-08-18 09:15:50 -07:00
|
|
|
return tp->full_name;
|
2014-07-21 06:27:23 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
EAPI Eina_Iterator *
|
2014-07-23 06:13:21 -07:00
|
|
|
eolian_type_namespaces_get(const Eolian_Type *tp)
|
2014-07-21 06:27:23 -07:00
|
|
|
{
|
|
|
|
Eolian_Type_Type tpp;
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL);
|
|
|
|
tpp = eolian_type_type_get(tp);
|
|
|
|
EINA_SAFETY_ON_FALSE_RETURN_VAL(tpp != EOLIAN_TYPE_POINTER
|
|
|
|
&& tpp != EOLIAN_TYPE_VOID, NULL);
|
|
|
|
if (!tp->namespaces) return NULL;
|
|
|
|
return eina_list_iterator_new(tp->namespaces);
|
2014-07-10 05:13:46 -07:00
|
|
|
}
|
2014-08-19 07:55:31 -07:00
|
|
|
|
|
|
|
EAPI Eina_Stringshare *
|
|
|
|
eolian_type_free_func_get(const Eolian_Type *tp)
|
|
|
|
{
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL);
|
|
|
|
return tp->freefunc;
|
|
|
|
}
|