diff options
author | Daniel Kolesa <d.kolesa@samsung.com> | 2014-08-12 14:48:31 +0100 |
---|---|---|
committer | Daniel Kolesa <d.kolesa@samsung.com> | 2014-08-21 09:26:04 +0100 |
commit | cf8da3790e2a03c19a2ac263606d3ed69fd90c85 (patch) | |
tree | 8cc604dc55c343009d429c76c46a52f09e811d66 | |
parent | e2fb43b7b5afeada56273d41e672b27991676062 (diff) | |
download | efl-cf8da3790e2a03c19a2ac263606d3ed69fd90c85.tar.gz |
eolian: add missing pieces of minor infra for enum
-rw-r--r-- | src/lib/eolian/database_type.c | 108 | ||||
-rw-r--r-- | src/lib/eolian/database_type_api.c | 1 |
2 files changed, 101 insertions, 8 deletions
diff --git a/src/lib/eolian/database_type.c b/src/lib/eolian/database_type.c index abf252b752..c7c8296fc5 100644 --- a/src/lib/eolian/database_type.c +++ b/src/lib/eolian/database_type.c @@ -123,6 +123,55 @@ _stype_to_str(const Eolian_Type *tp, Eina_Strbuf *buf, const char *name) } } +static Eina_Bool +_etype_field_cb(const Eina_Hash *hash EINA_UNUSED, const void *key, void *data, + void *fdata) +{ + Eina_Strbuf *buf = (Eina_Strbuf*)fdata; + const char *fname = (const char*)key; + Eolian_Enum_Field *ef = (Eolian_Enum_Field*)data; + eina_strbuf_append(buf, fname); + if (ef->value) + { + Eina_Value *val = NULL; + Eolian_Expression_Type et = eolian_expression_eval(ef->value, + EOLIAN_MASK_INT, &val); + const char *ret; + eina_strbuf_append(buf, " = "); + ret = eolian_expression_value_to_literal(val, et); + eina_strbuf_append(buf, ret); + eina_stringshare_del(ret); + } + eina_strbuf_append(buf, ", "); + return EINA_TRUE; +} + +static void +_etype_to_str(const Eolian_Type *tp, Eina_Strbuf *buf, const char *name) +{ + eina_strbuf_append(buf, "enum "); + if (tp->name) + { + Eina_List *l; + const char *sp; + EINA_LIST_FOREACH(tp->namespaces, l, 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_hash_foreach(tp->fields, _etype_field_cb, 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) { @@ -161,18 +210,35 @@ database_type_to_str(const Eolian_Type *tp, Eina_Strbuf *buf, const char *name) _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_REGULAR_STRUCT + || tp->type == EOLIAN_TYPE_REGULAR_ENUM || tp->type == EOLIAN_TYPE_VOID || tp->type == EOLIAN_TYPE_CLASS) && tp->is_const) { eina_strbuf_append(buf, "const "); } - if (tp->type == EOLIAN_TYPE_REGULAR || tp->type == EOLIAN_TYPE_CLASS) + if (tp->type == EOLIAN_TYPE_REGULAR + || tp->type == EOLIAN_TYPE_CLASS + || tp->type == EOLIAN_TYPE_REGULAR_STRUCT + || tp->type == EOLIAN_TYPE_REGULAR_ENUM) { Eina_List *l; const char *sp; + if (tp->type == EOLIAN_TYPE_REGULAR_STRUCT) + { + eina_strbuf_append(buf, "struct "); + } + else if (tp->type == EOLIAN_TYPE_REGULAR_ENUM) + { + eina_strbuf_append(buf, "enum "); + } EINA_LIST_FOREACH(tp->namespaces, l, sp) { eina_strbuf_append(buf, sp); @@ -182,11 +248,6 @@ database_type_to_str(const Eolian_Type *tp, Eina_Strbuf *buf, const char *name) if (kw) eina_strbuf_append(buf, eo_lexer_get_c_type(kw)); else eina_strbuf_append(buf, tp->name); } - else if (tp->type == EOLIAN_TYPE_REGULAR_STRUCT) - { - eina_strbuf_append(buf, "struct "); - eina_strbuf_append(buf, tp->name); - } else if (tp->type == EOLIAN_TYPE_VOID) eina_strbuf_append(buf, "void"); else @@ -209,12 +270,34 @@ static Eina_Bool _print_field(const Eina_Hash *hash EINA_UNUSED, const void *key, void *data, void *fdata EINA_UNUSED) { + Eolian_Struct_Field *sf = (Eolian_Struct_Field*)data; printf("%s: ", (const char*)key); - database_type_print((Eolian_Type*)data); + database_type_print(sf->type); printf("; "); return EINA_TRUE; } +static Eina_Bool +_print_enum_field(const Eina_Hash *hash EINA_UNUSED, const void *key, + void *data, void *fdata EINA_UNUSED) +{ + Eolian_Enum_Field *ef = (Eolian_Enum_Field*)data; + printf("%s", (const char*)key); + if (ef->value) + { + Eina_Value *val = NULL; + Eolian_Expression_Type et = eolian_expression_eval(ef->value, + EOLIAN_MASK_INT, &val); + const char *ret; + printf(" = "); + ret = eolian_expression_value_to_literal(val, et); + printf("%s", ret); + eina_stringshare_del(ret); + } + printf(", "); + return EINA_TRUE; +} + static void _typedef_print(Eolian_Type *tp) { @@ -242,6 +325,8 @@ database_type_print(Eolian_Type *tp) printf("void"); else if (tp->type == EOLIAN_TYPE_REGULAR_STRUCT) printf("struct %s", tp->full_name); + else if (tp->type == EOLIAN_TYPE_REGULAR_ENUM) + printf("enum %s", tp->full_name); else if (tp->type == EOLIAN_TYPE_POINTER) { database_type_print(tp->base_type); @@ -270,11 +355,18 @@ database_type_print(Eolian_Type *tp) else if (tp->type == EOLIAN_TYPE_STRUCT) { printf("struct "); - if (tp->name) printf("%s ", tp->name); + if (tp->full_name) printf("%s ", tp->full_name); printf("{ "); eina_hash_foreach(tp->fields, _print_field, NULL); printf("}"); } + else if (tp->type == EOLIAN_TYPE_ENUM) + { + printf("enum %s ", tp->full_name); + printf("{ "); + eina_hash_foreach(tp->fields, _print_enum_field, NULL); + printf("}"); + } if (tp->is_own) putchar(')'); if (tp->is_const) diff --git a/src/lib/eolian/database_type_api.c b/src/lib/eolian/database_type_api.c index ab0ea75c7d..26cb21c0d8 100644 --- a/src/lib/eolian/database_type_api.c +++ b/src/lib/eolian/database_type_api.c @@ -90,6 +90,7 @@ eolian_type_subtypes_get(const Eolian_Type *tp) EINA_SAFETY_ON_FALSE_RETURN_VAL(tpt == EOLIAN_TYPE_REGULAR || tpt == EOLIAN_TYPE_POINTER || tpt == EOLIAN_TYPE_REGULAR_STRUCT + || tpt == EOLIAN_TYPE_REGULAR_ENUM || tpt == EOLIAN_TYPE_CLASS, NULL); if (!tp->subtypes) return NULL; return eina_list_iterator_new(tp->subtypes); |