From b70299fd35f13bf820592443960df328a5d0b07b Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Thu, 15 Sep 2016 15:48:15 +0200 Subject: [PATCH] eolian gen2: initial type gen subroutine --- src/bin/eolian2/main.c | 7 +++++-- src/bin/eolian2/types.c | 43 +++++++++++++++++++++++++++++++++++++++++ src/bin/eolian2/types.h | 2 ++ 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/src/bin/eolian2/main.c b/src/bin/eolian2/main.c index 0e6b019e60..9edb821c25 100644 --- a/src/bin/eolian2/main.c +++ b/src/bin/eolian2/main.c @@ -221,12 +221,15 @@ _write_header(const char *ofname, const char *ifname, Eina_Bool legacy) INF("generating header: %s (legacy: %d)", ofname, legacy); Eina_Strbuf *buf = eina_strbuf_new(); + eo_gen_types_header_gen(ifname, buf, EINA_TRUE, legacy); + buf = _include_guard(ifname, "TYPES", buf); + Eina_Strbuf *cltd = eo_gen_class_typedef_gen(ifname); if (cltd) { cltd = _include_guard(ifname, "CLASS_TYPE", cltd); - eina_strbuf_append(buf, eina_strbuf_string_get(cltd)); - eina_strbuf_append_char(buf, '\n'); + eina_strbuf_prepend_char(buf, '\n'); + eina_strbuf_prepend(buf, eina_strbuf_string_get(cltd)); eina_strbuf_free(cltd); } diff --git a/src/bin/eolian2/types.c b/src/bin/eolian2/types.c index 4669e281c1..a2970cef8d 100644 --- a/src/bin/eolian2/types.c +++ b/src/bin/eolian2/types.c @@ -1,5 +1,48 @@ #include "main.h" +static Eina_Strbuf * +_type_generate(const Eolian_Typedecl *tp, Eina_Bool full, Eina_Bool legacy) +{ + return NULL; +} + +void eo_gen_types_header_gen(const char *eof, Eina_Strbuf *buf, + Eina_Bool full, Eina_Bool legacy) +{ + const Eolian_Declaration *decl; + + Eina_Iterator *itr = eolian_declarations_get_by_file(eof); + EINA_ITERATOR_FOREACH(itr, decl) + { + Eolian_Declaration_Type dt = eolian_declaration_type_get(decl); + if ((dt != EOLIAN_DECL_ALIAS) && + (dt != EOLIAN_DECL_STRUCT) && + (dt != EOLIAN_DECL_ENUM)) + continue; + if (dt == EOLIAN_DECL_ENUM && !full) + continue; + + const Eolian_Typedecl *tp = eolian_declaration_data_type_get(decl); + if (!tp || eolian_typedecl_is_extern(tp)) + continue; + + if (eolian_typedecl_type_get(tp) == EOLIAN_TYPEDECL_ALIAS) + { + const Eolian_Type *btp = eolian_typedecl_base_type_get(tp); + if (eolian_type_type_get(btp) == EOLIAN_TYPE_UNDEFINED) + continue; + } + + Eina_Strbuf *tbuf = _type_generate(tp, full, legacy); + if (tbuf) + { + eina_strbuf_append(buf, eina_strbuf_string_get(tbuf)); + eina_strbuf_append(buf, ";\n\n"); + eina_strbuf_free(tbuf); + } + } +} + Eina_Strbuf *eo_gen_class_typedef_gen(const char *eof) { const Eolian_Class *cl = eolian_class_get_by_file(eof); diff --git a/src/bin/eolian2/types.h b/src/bin/eolian2/types.h index 2f4434ecaa..609d097287 100644 --- a/src/bin/eolian2/types.h +++ b/src/bin/eolian2/types.h @@ -1,6 +1,8 @@ #ifndef EOLIAN_GEN_TYPES_H #define EOLIAN_GEN_TYPES_H +void eo_gen_types_header_gen(const char *eof, Eina_Strbuf *buf, + Eina_Bool full, Eina_Bool legacy); Eina_Strbuf *eo_gen_class_typedef_gen(const char *eof); #endif