eolian: new API eolian_type_enum_field_c_name_get

This API allows you to retrieve the C name of an arbitrary enum field,
respecting the legacy prefix and properly uppercasing the name.
This commit is contained in:
Daniel Kolesa 2015-05-12 17:04:54 +01:00
parent ed58165b50
commit 211b650c4b
6 changed files with 47 additions and 0 deletions

View File

@ -1563,6 +1563,18 @@ EAPI const Eolian_Enum_Type_Field *eolian_type_enum_field_get(const Eolian_Type
*/
EAPI Eina_Stringshare *eolian_type_enum_field_name_get(const Eolian_Enum_Type_Field *fl);
/*
* @brief Get the C name of a field of an enum type.
*
* The user of the API is responsible for the resulting stringshare.
*
* @param[in] fl the field.
* @return the name.
*
* @ingroup Eolian
*/
EAPI Eina_Stringshare *eolian_type_enum_field_c_name_get(const Eolian_Enum_Type_Field *fl);
/*
* @brief Get the description of a field of an enum type.
*

View File

@ -154,6 +154,28 @@ eolian_type_enum_field_name_get(const Eolian_Enum_Type_Field *fl)
return fl->name;
}
EAPI Eina_Stringshare *
eolian_type_enum_field_c_name_get(const Eolian_Enum_Type_Field *fl)
{
Eina_Stringshare *ret;
Eina_Strbuf *buf;
char *bufp;
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);
ret = eina_stringshare_add(bufp);
free(bufp);
return ret;
}
EAPI Eina_Stringshare *
eolian_type_enum_field_description_get(const Eolian_Enum_Type_Field *fl)
{

View File

@ -578,6 +578,7 @@ parse_enum(Eo_Lexer *ls, const char *name, Eina_Bool is_extern,
def->field_list = eina_list_append(def->field_list, fdef);
eo_lexer_get(ls);
FILL_BASE(fdef->base, ls, fline, fcol);
fdef->base_enum = def;
fdef->name = eina_stringshare_ref(fname);
if (ls->t.token != '=')
{

View File

@ -200,6 +200,7 @@ struct _Eolian_Struct_Type_Field
struct _Eolian_Enum_Type_Field
{
Eolian_Type *base_enum;
Eina_Stringshare *name;
Eolian_Object base;
Eolian_Expression *value;

View File

@ -6,6 +6,7 @@ enum Foo {
}
enum Bar {
legacy: test;
foo = Foo.baz
}

View File

@ -838,6 +838,7 @@ START_TEST(eolian_enum)
const Eolian_Type *type = NULL;
const Eolian_Class *class;
const Eolian_Expression *exp;
Eina_Stringshare *cname;
const char *name;
Eolian_Value v;
@ -868,6 +869,7 @@ START_TEST(eolian_enum)
fail_if(v.value.i != 15);
fail_if(!(type = eolian_type_enum_get_by_name("Bar")));
fail_if(strcmp(eolian_type_enum_legacy_prefix_get(type), "test"));
fail_if(!(field = eolian_type_enum_field_get(type, "foo")));
fail_if(!(exp = eolian_type_enum_field_value_get(field)));
@ -875,6 +877,10 @@ START_TEST(eolian_enum)
fail_if(v.type != EOLIAN_EXPR_INT);
fail_if(v.value.i != 15);
cname = eolian_type_enum_field_c_name_get(field);
fail_if(strcmp(cname, "TEST_FOO"));
eina_stringshare_del(cname);
fail_if(!(type = eolian_type_enum_get_by_name("Baz")));
fail_if(!(field = eolian_type_enum_field_get(type, "flag1")));
@ -889,6 +895,10 @@ START_TEST(eolian_enum)
fail_if(v.type != EOLIAN_EXPR_INT);
fail_if(v.value.i != (1 << 1));
cname = eolian_type_enum_field_c_name_get(field);
fail_if(strcmp(cname, "BAZ_FLAG2"));
eina_stringshare_del(cname);
fail_if(!(field = eolian_type_enum_field_get(type, "flag3")));
fail_if(!(exp = eolian_type_enum_field_value_get(field)));
v = eolian_expression_eval(exp, EOLIAN_MASK_ALL);