eolian gen: generate vars in source files for globals with value

This commit is contained in:
Daniel Kolesa 2016-10-20 15:11:17 +02:00
parent 9e12fd39af
commit 0ee248fb86
3 changed files with 52 additions and 4 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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