summaryrefslogtreecommitdiff
path: root/src/bin/eolian
diff options
context:
space:
mode:
authorDaniel Zaoui <daniel.zaoui@samsung.com>2014-07-24 11:55:08 +0300
committerDaniel Zaoui <daniel.zaoui@samsung.com>2014-07-24 11:59:34 +0300
commit805d74691067ffb339747a84fd0778626a556bed (patch)
tree0658d92993871495f7ce927bbec66ef8ecd874f8 /src/bin/eolian
parentfe3602b0d8d923bd312782a6190f11d433a1c70c (diff)
downloadefl-805d74691067ffb339747a84fd0778626a556bed.tar.gz
Eolian: Generate typedefs and structs.
This patch permits the generation of typedefs and structs in the legacy and Eo header files. It includes tests.
Diffstat (limited to 'src/bin/eolian')
-rw-r--r--src/bin/eolian/main.c17
-rw-r--r--src/bin/eolian/types_generator.c134
-rw-r--r--src/bin/eolian/types_generator.h18
3 files changed, 169 insertions, 0 deletions
diff --git a/src/bin/eolian/main.c b/src/bin/eolian/main.c
index d97c45b1e0..5be48ff549 100644
--- a/src/bin/eolian/main.c
+++ b/src/bin/eolian/main.c
@@ -7,6 +7,7 @@
#include "legacy_generator.h"
#include "eo_generator.h"
#include "impl_generator.h"
+#include "types_generator.h"
#include "common_funcs.h"
static Eina_Strbuf *
@@ -113,6 +114,16 @@ _generate_eo_header_file(char *filename, const char *eo_filename)
Eina_Strbuf *buffer = eina_strbuf_new();
+ if (!types_header_generate(eo_filename, buffer))
+ {
+ ERR("Failed to generate types of file %s", eo_filename);
+ goto end;
+ }
+ else
+ {
+ buffer = _include_guard_enclose(eo_filename, "TYPES", buffer);
+ }
+
const Eolian_Class *class = eolian_class_get_by_file(eo_filename);
if (class)
{
@@ -199,6 +210,12 @@ _generate_legacy_header_file(char *filename, const char *eo_filename)
Eina_Strbuf *buffer = eina_strbuf_new();
+ if (!types_header_generate(eo_filename, buffer))
+ {
+ ERR("Failed to generate types of file %s", eo_filename);
+ goto end;
+ }
+
const Eolian_Class *class = eolian_class_get_by_file(eo_filename);
if (class)
{
diff --git a/src/bin/eolian/types_generator.c b/src/bin/eolian/types_generator.c
new file mode 100644
index 0000000000..f5adcce192
--- /dev/null
+++ b/src/bin/eolian/types_generator.c
@@ -0,0 +1,134 @@
+#include <Eina.h>
+#include <string.h>
+
+#include "Eolian.h"
+#include "types_generator.h"
+#include "common_funcs.h"
+
+static char *
+_concat_name(const Eolian_Type *tp)
+{
+ const char *name;
+ char *str = NULL;
+ Eina_Strbuf *buf = eina_strbuf_new();
+ Eina_Iterator *itr = eolian_type_namespaces_get(tp);
+ EINA_ITERATOR_FOREACH(itr, name)
+ if (name) eina_strbuf_append_printf(buf, "%s_", name);
+ eina_iterator_free(itr);
+ name = eolian_type_name_get(tp);
+ if (name) eina_strbuf_append_printf(buf, "%s", name);
+ if (eina_strbuf_length_get(buf))
+ str = eina_strbuf_string_steal(buf);
+ eina_strbuf_free(buf);
+ return str;
+}
+
+static void
+_desc_generate(const char *desc, Eina_Strbuf *buf)
+{
+ if (desc)
+ {
+ eina_strbuf_append(buf, "/**\n");
+ eina_strbuf_append(buf, desc);
+ eina_strbuf_replace_all(buf, "\n", "\n * ");
+ eina_strbuf_append(buf, "\n */\n");
+ eina_strbuf_replace_all(buf, " * \n", " *\n"); /* Remove trailing whitespaces */
+ }
+}
+
+static Eina_Strbuf *
+_type_generate(const Eolian_Type *tp)
+{
+ Eina_Strbuf *buf = eina_strbuf_new();
+ _desc_generate(eolian_type_description_get(tp), buf);
+ Eolian_Type_Type tp_type = eolian_type_type_get(tp);
+ switch(tp_type)
+ {
+ case EOLIAN_TYPE_ALIAS:
+ {
+ const Eolian_Type *base_tp = eolian_type_base_type_get(tp);
+ Eolian_Type_Type base_tp_type = eolian_type_type_get(base_tp);
+ if (base_tp_type == EOLIAN_TYPE_STRUCT)
+ {
+ const char *name = eolian_type_name_get(tp);
+ Eina_Strbuf *struct_buf = _type_generate(base_tp);
+ eina_strbuf_append_printf(buf, "typedef %s%s%s",
+ eina_strbuf_string_get(struct_buf),
+ name?" ":"", name?name:"");
+ eina_strbuf_free(struct_buf);
+ }
+ else
+ {
+ char *name = _concat_name(tp);
+ Eina_Stringshare *c_type = eolian_type_c_type_get(base_tp);
+ eina_strbuf_append_printf(buf, "typedef %s%s%s",
+ c_type, !name || strchr(c_type, '*')?"":" ",
+ name?name:"");
+ free(name);
+ }
+ break;
+ }
+ case EOLIAN_TYPE_STRUCT:
+ {
+ const char *member_name;
+ char *name = _concat_name(tp);
+ eina_strbuf_append_printf(buf, "struct%s%s {\n", name?" ":"", name?name:"");
+ free(name);
+ Eina_Iterator *members = eolian_type_struct_field_names_get(tp);
+ EINA_ITERATOR_FOREACH(members, member_name)
+ {
+ const char *desc = eolian_type_struct_field_description_get(tp, member_name);
+ const Eolian_Type *member = eolian_type_struct_field_get(tp, member_name);
+ Eina_Stringshare *c_type = eolian_type_c_type_get(member);
+ eina_strbuf_append_printf(buf, " %s%s%s;",
+ c_type, strchr(c_type, '*')?"":" ",
+ member_name);
+ if (desc) eina_strbuf_append_printf(buf, " /** %s */", desc);
+ eina_strbuf_append(buf, "\n");
+ }
+ eina_iterator_free(members);
+ eina_strbuf_append(buf, "}");
+ break;
+ }
+ default:
+ {
+ eina_strbuf_reset(buf);
+ }
+ }
+ return buf;
+}
+
+Eina_Bool
+types_header_generate(const char *eo_filename, Eina_Strbuf *buf)
+{
+ const Eolian_Type *tp;
+
+ /* Generation of typedefs */
+ Eina_Iterator *itr = eolian_type_aliases_get_by_file(eo_filename);
+ EINA_ITERATOR_FOREACH(itr, tp)
+ {
+ Eina_Strbuf *type_buf = _type_generate(tp);
+ if (type_buf)
+ {
+ eina_strbuf_append(buf, eina_strbuf_string_get(type_buf));
+ eina_strbuf_append(buf, ";\n\n");
+ eina_strbuf_free(type_buf);
+ }
+ }
+ eina_iterator_free(itr);
+
+ /* Generation of structs */
+ itr = eolian_type_structs_get_by_file(eo_filename);
+ EINA_ITERATOR_FOREACH(itr, tp)
+ {
+ Eina_Strbuf *type_buf = _type_generate(tp);
+ if (type_buf)
+ {
+ eina_strbuf_append(buf, eina_strbuf_string_get(type_buf));
+ eina_strbuf_append(buf, ";\n\n");
+ eina_strbuf_free(type_buf);
+ }
+ }
+ eina_iterator_free(itr);
+ return EINA_TRUE;
+}
diff --git a/src/bin/eolian/types_generator.h b/src/bin/eolian/types_generator.h
new file mode 100644
index 0000000000..6738b022c2
--- /dev/null
+++ b/src/bin/eolian/types_generator.h
@@ -0,0 +1,18 @@
+#ifndef TYPES_GENERATOR_H
+#define TYPES_GENERATOR_H
+
+#include<Eina.h>
+
+/*
+ * @brief Generate the header code for the types of a specific file.
+ *
+ * @param[in] eo_filename Eo filename
+ * @param[inout] buf buffer to fill
+ *
+ * @return EINA_TRUE on success, EINA_FALSE on error.
+ *
+ */
+Eina_Bool types_header_generate(const char *eo_filename, Eina_Strbuf *buf);
+
+#endif
+