From 0ee248fb86c2f40b3b988bfa497fd1feea59a2d9 Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Thu, 20 Oct 2016 15:11:17 +0200 Subject: [PATCH] eolian gen: generate vars in source files for globals with value --- src/bin/eolian/main.c | 9 +++++---- src/bin/eolian/types.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ src/bin/eolian/types.h | 1 + 3 files changed, 52 insertions(+), 4 deletions(-) diff --git a/src/bin/eolian/main.c b/src/bin/eolian/main.c index dbde5bc..1b29327 100644 --- a/src/bin/eolian/main.c +++ b/src/bin/eolian/main.c @@ -336,14 +336,15 @@ _write_stub_header(const char *ofname, const char *ifname) } static Eina_Bool -_write_source(const char *ofname, const char *ifname) +_write_source(const char *ofname, const char *ifname, Eina_Bool eot) { INF("generating source: %s", ofname); Eina_Strbuf *buf = eina_strbuf_new(); const Eolian_Class *cl = eolian_class_get_by_file(ifname); + eo_gen_types_source_gen(ifname, buf); eo_gen_source_gen(cl, buf); - if (cl) + if (cl || (eot && eina_strbuf_length_get(buf))) { if (_write_file(ofname, buf)) { @@ -484,7 +485,7 @@ main(int argc, char **argv) const char *eobn = _get_filename(input); if (!gen_what) - gen_what = !strcmp(ext, ".eot") ? GEN_H : (GEN_H | GEN_C); + gen_what = GEN_H | GEN_C; Eina_Bool succ = EINA_TRUE; if (gen_what & GEN_H) @@ -494,7 +495,7 @@ main(int argc, char **argv) if (succ && (gen_what & GEN_H_STUB)) succ = _write_stub_header(outs[_get_bit_pos(GEN_H_STUB)], eobn); if (succ && (gen_what & GEN_C)) - succ = _write_source(outs[_get_bit_pos(GEN_C)], eobn); + succ = _write_source(outs[_get_bit_pos(GEN_C)], eobn, !strcmp(ext, ".eot")); if (succ && (gen_what & GEN_C_IMPL)) succ = _write_impl(outs[_get_bit_pos(GEN_C_IMPL)], eobn); diff --git a/src/bin/eolian/types.c b/src/bin/eolian/types.c index 3b6fa5c..86cfb5b 100644 --- a/src/bin/eolian/types.c +++ b/src/bin/eolian/types.c @@ -236,6 +236,52 @@ void eo_gen_types_header_gen(const char *eof, Eina_Strbuf *buf, } } +void eo_gen_types_source_gen(const char *eof, Eina_Strbuf *buf) +{ + 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_VAR) + continue; + + const Eolian_Variable *vr = eolian_declaration_variable_get(decl); + if (!vr || eolian_variable_is_extern(vr)) + continue; + + if (eolian_variable_type_get(vr) == EOLIAN_VAR_CONSTANT) + continue; + + const Eolian_Expression *vv = eolian_variable_value_get(vr); + if (!vv) + continue; + + char *fn = strdup(eolian_variable_full_name_get(vr)); + for (char *p = strchr(fn, '.'); p; p = strchr(p, '.')) + *p = '_'; + + const Eolian_Type *vt = eolian_variable_base_type_get(vr); + Eina_Stringshare *ct = eolian_type_c_type_get(vt); + eina_strbuf_append_printf(buf, "%s %s = ", ct, fn); + eina_stringshare_del(ct); + + Eolian_Value val = eolian_expression_eval_type(vv, vt); + Eina_Stringshare *lit = eolian_expression_value_to_literal(&val); + eina_strbuf_append(buf, lit); + eina_strbuf_append_char(buf, ';'); + Eina_Stringshare *exp = eolian_expression_serialize(vv); + if (exp && strcmp(lit, exp)) + eina_strbuf_append_printf(buf, " /* %s */", exp); + eina_stringshare_del(lit); + eina_stringshare_del(exp); + + eina_strbuf_append(buf, "\n"); + } +} + 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/eolian/types.h b/src/bin/eolian/types.h index 609d097..4b04a66 100644 --- a/src/bin/eolian/types.h +++ b/src/bin/eolian/types.h @@ -3,6 +3,7 @@ void eo_gen_types_header_gen(const char *eof, Eina_Strbuf *buf, Eina_Bool full, Eina_Bool legacy); +void eo_gen_types_source_gen(const char *eof, Eina_Strbuf *buf); Eina_Strbuf *eo_gen_class_typedef_gen(const char *eof); #endif -- 2.7.4