summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Kolesa <d.kolesa@samsung.com>2014-08-12 14:48:31 +0100
committerDaniel Kolesa <d.kolesa@samsung.com>2014-08-21 09:26:04 +0100
commitcf8da3790e2a03c19a2ac263606d3ed69fd90c85 (patch)
tree8cc604dc55c343009d429c76c46a52f09e811d66
parente2fb43b7b5afeada56273d41e672b27991676062 (diff)
downloadefl-cf8da3790e2a03c19a2ac263606d3ed69fd90c85.tar.gz
eolian: add missing pieces of minor infra for enum
-rw-r--r--src/lib/eolian/database_type.c108
-rw-r--r--src/lib/eolian/database_type_api.c1
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);