eolian gen2: initial header generation
authorDaniel Kolesa <d.kolesa@osg.samsung.com>
Mon, 19 Sep 2016 15:36:48 +0000 (17:36 +0200)
committerDaniel Kolesa <d.kolesa@osg.samsung.com>
Fri, 7 Oct 2016 09:54:23 +0000 (11:54 +0200)
src/Makefile_Eolian.am
src/bin/eolian2/headers.c [new file with mode: 0644]
src/bin/eolian2/headers.h [new file with mode: 0644]
src/bin/eolian2/main.c

index 654194a..af99b08 100644 (file)
@@ -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 (file)
index 0000000..cfa4a1e
--- /dev/null
@@ -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 (file)
index 0000000..55b4c07
--- /dev/null
@@ -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
index 731f1b1..fb0773c 100644 (file)
@@ -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;