forked from enlightenment/efl
eolian: separate type_to_str for decls
This commit is contained in:
parent
5401c775ec
commit
c3a33653f3
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 *
|
||||
|
|
|
@ -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 */
|
||||
|
||||
|
|
Loading…
Reference in New Issue