diff options
author | Daniel Zaoui <daniel.zaoui@samsung.com> | 2014-07-24 11:55:08 +0300 |
---|---|---|
committer | Daniel Zaoui <daniel.zaoui@samsung.com> | 2014-07-24 11:59:34 +0300 |
commit | 805d74691067ffb339747a84fd0778626a556bed (patch) | |
tree | 0658d92993871495f7ce927bbec66ef8ecd874f8 /src/bin/eolian | |
parent | fe3602b0d8d923bd312782a6190f11d433a1c70c (diff) | |
download | efl-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.c | 17 | ||||
-rw-r--r-- | src/bin/eolian/types_generator.c | 134 | ||||
-rw-r--r-- | src/bin/eolian/types_generator.h | 18 |
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 + |