eolian: simplify enum generation logic

This commit is contained in:
Daniel Kolesa 2016-07-07 15:59:09 +01:00
parent db98dd00d0
commit 6a05289063
1 changed files with 5 additions and 20 deletions

View File

@ -111,37 +111,23 @@ _type_generate(const Eolian_Typedecl *tp, Eina_Bool full, Eina_Bool use_legacy)
case EOLIAN_TYPEDECL_ENUM: case EOLIAN_TYPEDECL_ENUM:
{ {
const Eolian_Enum_Type_Field *member; const Eolian_Enum_Type_Field *member;
char *name;
if (!full) if (!full)
break; break;
name = _concat_name(tp); char *name = _concat_name(tp);
char *pre = NULL;
eina_strbuf_append_printf(buf, "typedef enum\n{\n"); eina_strbuf_append_printf(buf, "typedef enum\n{\n");
if (eolian_typedecl_enum_legacy_prefix_get(tp))
pre = strdup(eolian_typedecl_enum_legacy_prefix_get(tp));
else
pre = strdup(name);
eina_str_toupper(&pre);
Eina_Iterator *members = eolian_typedecl_enum_fields_get(tp); Eina_Iterator *members = eolian_typedecl_enum_fields_get(tp);
Eina_Bool next = eina_iterator_next(members, (void**)&member); Eina_Bool next = eina_iterator_next(members, (void**)&member);
Eina_Strbuf *membuf = eina_strbuf_new();
while (next) while (next)
{ {
const Eolian_Expression *value = eolian_typedecl_enum_field_value_get(member, EINA_FALSE); const Eolian_Expression *value = eolian_typedecl_enum_field_value_get(member, EINA_FALSE);
char *memb_u = strdup(eolian_typedecl_enum_field_name_get(member)); Eina_Stringshare *membn = eolian_typedecl_enum_field_c_name_get(member);
eina_str_toupper(&memb_u);
eina_strbuf_reset(membuf);
eina_strbuf_append(membuf, pre);
eina_strbuf_append_char(membuf, '_');
eina_strbuf_append(membuf, memb_u);
free(memb_u);
if (!value) if (!value)
eina_strbuf_append_printf(buf, " %s", eina_strbuf_string_get(membuf)); eina_strbuf_append_printf(buf, " %s", membn);
else else
{ {
Eolian_Value val = eolian_expression_eval(value, EOLIAN_MASK_INT); Eolian_Value val = eolian_expression_eval(value, EOLIAN_MASK_INT);
const char *lit = eolian_expression_value_to_literal(&val); const char *lit = eolian_expression_value_to_literal(&val);
eina_strbuf_append_printf(buf, " %s = %s", eina_strbuf_string_get(membuf), lit); eina_strbuf_append_printf(buf, " %s = %s", membn, lit);
const char *exp = eolian_expression_serialize(value); const char *exp = eolian_expression_serialize(value);
if (exp && strcmp(lit, exp)) if (exp && strcmp(lit, exp))
{ {
@ -150,6 +136,7 @@ _type_generate(const Eolian_Typedecl *tp, Eina_Bool full, Eina_Bool use_legacy)
} }
eina_stringshare_del(lit); eina_stringshare_del(lit);
} }
eina_stringshare_del(membn);
const Eolian_Documentation *fdoc const Eolian_Documentation *fdoc
= eolian_typedecl_enum_field_documentation_get(member); = eolian_typedecl_enum_field_documentation_get(member);
next = eina_iterator_next(members, (void**)&member); next = eina_iterator_next(members, (void**)&member);
@ -170,9 +157,7 @@ _type_generate(const Eolian_Typedecl *tp, Eina_Bool full, Eina_Bool use_legacy)
eina_strbuf_append(buf, "\n"); eina_strbuf_append(buf, "\n");
} }
eina_strbuf_append_printf(buf, "} %s", name); eina_strbuf_append_printf(buf, "} %s", name);
eina_strbuf_free(membuf);
free(name); free(name);
free(pre);
eina_iterator_free(members); eina_iterator_free(members);
break; break;
} }