From 12c3bdee3e4fd046f3c2c5b8a8361d1975277215 Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Mon, 19 Sep 2016 17:36:48 +0200 Subject: [PATCH] eolian gen2: initial header generation --- src/Makefile_Eolian.am | 4 +- src/bin/eolian2/headers.c | 134 ++++++++++++++++++++++++++++++++++++++ src/bin/eolian2/headers.h | 8 +++ src/bin/eolian2/main.c | 42 ++++++++++-- 4 files changed, 182 insertions(+), 6 deletions(-) create mode 100644 src/bin/eolian2/headers.c create mode 100644 src/bin/eolian2/headers.h diff --git a/src/Makefile_Eolian.am b/src/Makefile_Eolian.am index 654194a3a3..af99b08447 100644 --- a/src/Makefile_Eolian.am +++ b/src/Makefile_Eolian.am @@ -75,7 +75,9 @@ bin_eolian2_eolian_gen2_SOURCES = \ bin/eolian2/main.c \ bin/eolian2/main.h \ bin/eolian2/types.c \ - bin/eolian2/types.h + bin/eolian2/types.h \ + bin/eolian2/headers.c \ + bin/eolian2/headers.h bin_eolian2_eolian_gen2_CPPFLAGS = -I$(top_builddir)/src/lib/efl @EOLIAN_CFLAGS@ bin_eolian2_eolian_gen2_LDADD = @USE_EOLIAN_LIBS@ diff --git a/src/bin/eolian2/headers.c b/src/bin/eolian2/headers.c new file mode 100644 index 0000000000..cfa4a1e50b --- /dev/null +++ b/src/bin/eolian2/headers.c @@ -0,0 +1,134 @@ +#include "main.h" + +const char * +_cl_type_str_get(const Eolian_Class *cl, Eina_Bool uc) +{ + switch (eolian_class_type_get(cl)) + { + case EOLIAN_CLASS_REGULAR: + case EOLIAN_CLASS_ABSTRACT: + return uc ? "CLASS" : "class"; + case EOLIAN_CLASS_MIXIN: + return uc ? "MIXIN" : "mixin"; + case EOLIAN_CLASS_INTERFACE: + return uc ? "INTERFACE" : "interface"; + default: + return NULL; + } +} + +static void +_gen_func(const Eolian_Class *cl, const Eolian_Function *fid, + Eolian_Function_Type ftype, Eina_Strbuf *buf) +{ +} + +void +eo_gen_header_gen(const Eolian_Class *cl, Eina_Strbuf *buf, Eina_Bool legacy) +{ + if (!cl) + return; + + char *cname = NULL, *cnameu = NULL, *cnamel = NULL; + + cname = eo_gen_c_full_name_get(eolian_class_full_name_get(cl)); + if (!cname) + goto end; + + cnameu = strdup(cname); + if (!cnameu) + goto end; + eina_str_toupper(&cnameu); + + cnamel = strdup(cname); + if (!cnamel) + goto end; + eina_str_tolower(&cnamel); + + /* class definition */ + + eina_strbuf_append_printf(buf, "#define %s_%s %s_%s_get()\n\n", + cnameu, _cl_type_str_get(cl, EINA_TRUE), + cnamel, _cl_type_str_get(cl, EINA_FALSE)); + + eina_strbuf_append_printf(buf, "EWAPI const Efl_Class *%s_%s_get(void);\n\n", + cnamel, _cl_type_str_get(cl, EINA_FALSE)); + + /* method section */ + { + Eina_Iterator *itr = eolian_class_implements_get(cl); + if (!itr) + goto events; + + const Eolian_Implement *imp; + EINA_ITERATOR_FOREACH(itr, imp) + { + if (eolian_implement_class_get(imp) != cl) + continue; + Eolian_Function_Type ftype = EOLIAN_UNRESOLVED; + const Eolian_Function *fid = eolian_implement_function_get(imp, &ftype); + switch (ftype) + { + case EOLIAN_PROP_GET: + case EOLIAN_PROP_SET: + _gen_func(cl, fid, ftype, buf); + break; + case EOLIAN_PROPERTY: + _gen_func(cl, fid, EOLIAN_PROP_SET, buf); + _gen_func(cl, fid, EOLIAN_PROP_GET, buf); + break; + default: + _gen_func(cl, fid, EOLIAN_UNRESOLVED, buf); + } + } + eina_iterator_free(itr); + } + +events: + /* event section */ + { + Eina_Iterator *itr = eolian_class_events_get(cl); + Eolian_Event *ev; + EINA_ITERATOR_FOREACH(itr, ev) + { + Eina_Stringshare *evn = eolian_event_c_name_get(ev); + Eolian_Object_Scope evs = eolian_event_scope_get(ev); + + if (evs == EOLIAN_SCOPE_PRIVATE) + continue; + + if (eolian_event_is_beta(ev)) + { + eina_strbuf_append_printf(buf, "\n#ifndef %s_BETA\n", cnameu); + eina_strbuf_append_printf(buf, "#define %s_BETA\n", cnameu); + } + if (evs == EOLIAN_SCOPE_PROTECTED) + { + if (!eolian_event_is_beta(ev)) + eina_strbuf_append_char(buf, '\n'); + eina_strbuf_append_printf(buf, "#ifndef %s_PROTECTED\n", cnameu); + eina_strbuf_append_printf(buf, "#define %s_PROTECTED\n", cnameu); + } + + if (!eolian_event_is_beta(ev) && evs == EOLIAN_SCOPE_PUBLIC) + eina_strbuf_append_char(buf, '\n'); + + eina_strbuf_append_printf(buf, "EOAPI extern const " + "Efl_Event_Description _%s;\n", evn); + eina_strbuf_append_printf(buf, "#define %s (&(_%s))\n", evn, evn); + + if (evs == EOLIAN_SCOPE_PROTECTED) + eina_strbuf_append(buf, "#endif\n"); + if (eolian_event_is_beta(ev)) + eina_strbuf_append(buf, "#endif\n"); + + eina_stringshare_del(evn); + } + eina_iterator_free(itr); + } + +end: + free(cname); + free(cnameu); + free(cnamel); +} diff --git a/src/bin/eolian2/headers.h b/src/bin/eolian2/headers.h new file mode 100644 index 0000000000..55b4c071b0 --- /dev/null +++ b/src/bin/eolian2/headers.h @@ -0,0 +1,8 @@ +#ifndef EOLIAN_GEN_HEADERS_H +#define EOLIAN_GEN_HEADERS_H + +#include "main.h" + +void eo_gen_header_gen(const Eolian_Class *cl, Eina_Strbuf *buf, Eina_Bool legacy); + +#endif diff --git a/src/bin/eolian2/main.c b/src/bin/eolian2/main.c index 731f1b1f52..fb0773c649 100644 --- a/src/bin/eolian2/main.c +++ b/src/bin/eolian2/main.c @@ -7,6 +7,7 @@ #include "main.h" #include "types.h" +#include "headers.h" int _eolian_gen_log_dom = -1; @@ -133,6 +134,27 @@ _include_guard(const char *fname, const char *gname, Eina_Strbuf *buf) return g; } +static const char * +_get_filename(const char *path) +{ + if (!path) + return NULL; + const char *ret1 = strrchr(path, '/'); + const char *ret2 = strrchr(path, '\\'); + if (!ret1 && !ret2) + return path; + if (ret1 && ret2) + { + if (ret1 > ret2) + return ret1 + 1; + else + return ret2 + 1; + } + if (ret1) + return ret1 + 1; + return ret2 + 1; +} + static Eina_Bool _write_file(const char *fname, const Eina_Strbuf *buf, Eina_Bool append) { @@ -232,9 +254,19 @@ _write_header(const char *ofname, const char *ifname, Eina_Bool legacy) eina_strbuf_free(cltd); } - Eina_Bool ret = _write_file(ofname, buf, EINA_FALSE); - eina_strbuf_free(buf); - return ret; + const Eolian_Class *cl = eolian_class_get_by_file(ifname); + eo_gen_header_gen(cl, buf, legacy); + if (cl || !legacy) + { + buf = _include_guard(_get_filename(ofname), NULL, buf); + if (_write_file(ofname, buf, EINA_FALSE)) + { + eina_strbuf_free(buf); + return EINA_TRUE; + } + } + + return EINA_FALSE; } static Eina_Bool @@ -391,9 +423,9 @@ main(int argc, char **argv) char *inoext = strdup(input); inoext[ext - input] = '\0'; _fill_all_outs(outs, inoext); + free(inoext); - inoext[ext - input] = '.'; - char *eobn = basename(inoext); + const char *eobn = _get_filename(input); if (!gen_what) gen_what = GEN_H | GEN_H_LEGACY | GEN_C;