diff --git a/src/lib/eolian/database_type.c b/src/lib/eolian/database_type.c index 2d5b11a092..edbf27c0af 100644 --- a/src/lib/eolian/database_type.c +++ b/src/lib/eolian/database_type.c @@ -131,123 +131,9 @@ database_enum_add(Eolian_Type *tp) database_decl_add(tp->full_name, EOLIAN_DECL_ENUM, tp->base.file, tp->decl); } -static void -_stype_to_str(const Eolian_Type *tp, Eina_Strbuf *buf, const char *name) -{ - Eolian_Struct_Type_Field *sf; - Eina_List *l; - eina_strbuf_append(buf, "struct "); - if (tp->name) - { - Eina_List *m; - const char *sp; - EINA_LIST_FOREACH(tp->namespaces, m, sp) - { - eina_strbuf_append(buf, sp); - eina_strbuf_append_char(buf, '_'); - } - eina_strbuf_append(buf, tp->name); - eina_strbuf_append_char(buf, ' '); - } - if (tp->type == EOLIAN_TYPE_STRUCT_OPAQUE) - goto append_name; - eina_strbuf_append(buf, "{ "); - EINA_LIST_FOREACH(tp->field_list, l, sf) - { - database_type_to_str(sf->type, buf, sf->name); - eina_strbuf_append(buf, "; "); - } - eina_strbuf_append(buf, "}"); -append_name: - if (name) - { - eina_strbuf_append_char(buf, ' '); - eina_strbuf_append(buf, name); - } -} - -static void -_etype_to_str(const Eolian_Type *tp, Eina_Strbuf *buf, const char *name) -{ - Eolian_Enum_Type_Field *ef; - Eina_List *l; - eina_strbuf_append(buf, "enum "); - if (tp->name) - { - Eina_List *m; - const char *sp; - EINA_LIST_FOREACH(tp->namespaces, m, sp) - { - eina_strbuf_append(buf, sp); - eina_strbuf_append_char(buf, '_'); - } - eina_strbuf_append(buf, tp->name); - eina_strbuf_append_char(buf, ' '); - } - eina_strbuf_append(buf, "{ "); - EINA_LIST_FOREACH(tp->field_list, l, ef) - { - eina_strbuf_append(buf, ef->name); - if (ef->value) - { - Eolian_Value val = eolian_expression_eval(ef->value, - EOLIAN_MASK_INT); - const char *ret; - eina_strbuf_append(buf, " = "); - ret = eolian_expression_value_to_literal(&val); - eina_strbuf_append(buf, ret); - eina_stringshare_del(ret); - } - if (l != eina_list_last(tp->field_list)) - eina_strbuf_append(buf, ", "); - } - eina_strbuf_append(buf, " }"); - if (name) - { - eina_strbuf_append_char(buf, ' '); - eina_strbuf_append(buf, name); - } -} - -static void -_atype_to_str(const Eolian_Type *tp, Eina_Strbuf *buf) -{ - Eina_Strbuf *fulln = eina_strbuf_new(); - Eina_List *l; - const char *sp; - - eina_strbuf_append(buf, "typedef "); - - EINA_LIST_FOREACH(tp->namespaces, l, sp) - { - eina_strbuf_append(fulln, sp); - eina_strbuf_append_char(fulln, '_'); - } - eina_strbuf_append(fulln, tp->name); - - database_type_to_str(tp->base_type, buf, eina_strbuf_string_get(fulln)); - eina_strbuf_free(fulln); -} - void database_type_to_str(const Eolian_Type *tp, Eina_Strbuf *buf, const char *name) { - if (tp->type == EOLIAN_TYPE_ALIAS) - { - _atype_to_str(tp, buf); - return; - } - else if (tp->type == EOLIAN_TYPE_STRUCT - || tp->type == EOLIAN_TYPE_STRUCT_OPAQUE) - { - _stype_to_str(tp, buf, name); - return; - } - else if (tp->type == EOLIAN_TYPE_ENUM) - { - _etype_to_str(tp, buf, name); - return; - } if ((tp->type == EOLIAN_TYPE_REGULAR || tp->type == EOLIAN_TYPE_COMPLEX || tp->type == EOLIAN_TYPE_VOID @@ -291,3 +177,129 @@ database_type_to_str(const Eolian_Type *tp, Eina_Strbuf *buf, const char *name) eina_strbuf_append(buf, name); } } + +static void +_stype_to_str(const Eolian_Typedecl *tp, Eina_Strbuf *buf, const char *name) +{ + Eolian_Struct_Type_Field *sf; + Eina_List *l; + eina_strbuf_append(buf, "struct "); + if (tp->name) + { + Eina_List *m; + const char *sp; + EINA_LIST_FOREACH(tp->namespaces, m, sp) + { + eina_strbuf_append(buf, sp); + eina_strbuf_append_char(buf, '_'); + } + eina_strbuf_append(buf, tp->name); + eina_strbuf_append_char(buf, ' '); + } + if (tp->type == EOLIAN_TYPEDECL_STRUCT_OPAQUE) + goto append_name; + eina_strbuf_append(buf, "{ "); + EINA_LIST_FOREACH(tp->field_list, l, sf) + { + database_type_to_str(sf->type, buf, sf->name); + eina_strbuf_append(buf, "; "); + } + eina_strbuf_append(buf, "}"); +append_name: + if (name) + { + eina_strbuf_append_char(buf, ' '); + eina_strbuf_append(buf, name); + } +} + +static void +_etype_to_str(const Eolian_Typedecl *tp, Eina_Strbuf *buf, const char *name) +{ + Eolian_Enum_Type_Field *ef; + Eina_List *l; + eina_strbuf_append(buf, "enum "); + if (tp->name) + { + Eina_List *m; + const char *sp; + EINA_LIST_FOREACH(tp->namespaces, m, sp) + { + eina_strbuf_append(buf, sp); + eina_strbuf_append_char(buf, '_'); + } + eina_strbuf_append(buf, tp->name); + eina_strbuf_append_char(buf, ' '); + } + eina_strbuf_append(buf, "{ "); + EINA_LIST_FOREACH(tp->field_list, l, ef) + { + eina_strbuf_append(buf, ef->name); + if (ef->value) + { + Eolian_Value val = eolian_expression_eval(ef->value, + EOLIAN_MASK_INT); + const char *ret; + eina_strbuf_append(buf, " = "); + ret = eolian_expression_value_to_literal(&val); + eina_strbuf_append(buf, ret); + eina_stringshare_del(ret); + } + if (l != eina_list_last(tp->field_list)) + eina_strbuf_append(buf, ", "); + } + eina_strbuf_append(buf, " }"); + if (name) + { + eina_strbuf_append_char(buf, ' '); + eina_strbuf_append(buf, name); + } +} + +static void +_atype_to_str(const Eolian_Typedecl *tp, Eina_Strbuf *buf) +{ + Eina_Strbuf *fulln = eina_strbuf_new(); + Eina_List *l; + const char *sp; + + eina_strbuf_append(buf, "typedef "); + + EINA_LIST_FOREACH(tp->namespaces, l, sp) + { + eina_strbuf_append(fulln, sp); + eina_strbuf_append_char(fulln, '_'); + } + eina_strbuf_append(fulln, tp->name); + + database_type_to_str(tp->base_type, buf, eina_strbuf_string_get(fulln)); + eina_strbuf_free(fulln); +} + +void +database_typedecl_to_str(const Eolian_Typedecl *tp, Eina_Strbuf *buf, const char *name) +{ + if (tp->type == EOLIAN_TYPEDECL_ALIAS) + { + _atype_to_str(tp, buf); + return; + } + else if (tp->type == EOLIAN_TYPEDECL_STRUCT + || tp->type == EOLIAN_TYPEDECL_STRUCT_OPAQUE) + { + _stype_to_str(tp, buf, name); + return; + } + else if (tp->type == EOLIAN_TYPEDECL_ENUM) + { + _etype_to_str(tp, buf, name); + return; + } + else + return; + if (name) + { + eina_strbuf_append_char(buf, ' '); + eina_strbuf_append(buf, name); + } +} diff --git a/src/lib/eolian/database_type_api.c b/src/lib/eolian/database_type_api.c index c64cd78911..f167004f22 100644 --- a/src/lib/eolian/database_type_api.c +++ b/src/lib/eolian/database_type_api.c @@ -340,8 +340,14 @@ eolian_type_c_type_named_get(const Eolian_Type *tp, const char *name) EAPI Eina_Stringshare * eolian_typedecl_c_type_named_get(const Eolian_Typedecl *tp, const char *name) { + Eina_Stringshare *ret; + Eina_Strbuf *buf; EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL); - return eolian_type_c_type_named_get(tp->parent, name); + buf = eina_strbuf_new(); + database_typedecl_to_str(tp, buf, name); + ret = eina_stringshare_add(eina_strbuf_string_get(buf)); + eina_strbuf_free(buf); + return ret; } EAPI Eina_Stringshare * diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h index 4919c55bf5..0a14d21382 100644 --- a/src/lib/eolian/eolian_database.h +++ b/src/lib/eolian/eolian_database.h @@ -311,6 +311,7 @@ void database_typedef_del(Eolian_Type *tp); void database_typedecl_del(Eolian_Typedecl *tp); void database_type_to_str(const Eolian_Type *tp, Eina_Strbuf *buf, const char *name); +void database_typedecl_to_str(const Eolian_Typedecl *tp, Eina_Strbuf *buf, const char *name); /* expressions */