eolian gen2: generate fully functional eo headers
authorDaniel Kolesa <d.kolesa@osg.samsung.com>
Tue, 20 Sep 2016 12:22:05 +0000 (14:22 +0200)
committerDaniel Kolesa <d.kolesa@osg.samsung.com>
Fri, 7 Oct 2016 09:54:23 +0000 (11:54 +0200)
src/bin/eolian2/headers.c

index cfa4a1e..69dc94f 100644 (file)
@@ -1,6 +1,6 @@
 #include "main.h"
 
-const char *
+static const char *
 _cl_type_str_get(const Eolian_Class *cl, Eina_Bool uc)
 {
    switch (eolian_class_type_get(cl))
@@ -17,10 +17,116 @@ _cl_type_str_get(const Eolian_Class *cl, Eina_Bool uc)
      }
 }
 
+static const char *
+_get_add_star(Eolian_Function_Type ftype, Eolian_Parameter_Dir pdir)
+{
+   if (ftype == EOLIAN_PROP_GET)
+     return "*";
+   if ((pdir == EOLIAN_OUT_PARAM) || (pdir == EOLIAN_INOUT_PARAM))
+     return "*";
+   return "";
+}
+
 static void
-_gen_func(const Eolian_Class *cl, const Eolian_Function *fid,
-          Eolian_Function_Type ftype, Eina_Strbuf *buf)
+_gen_func(const Eolian_Function *fid, Eolian_Function_Type ftype,
+          Eina_Strbuf *buf, char *cnameu, Eina_Bool legacy)
 {
+   Eina_Stringshare *fcn = eolian_function_full_c_name_get(fid, ftype, legacy);
+   if (!fcn)
+     return;
+
+   Eina_Bool var_as_ret = EINA_FALSE;
+   const Eolian_Type *rtp = eolian_function_return_type_get(fid, ftype);
+   if (ftype == EOLIAN_PROP_GET && !rtp)
+     {
+        void *d1, *d2;
+        Eina_Iterator *itr = eolian_property_values_get(fid, ftype);
+        if (eina_iterator_next(itr, &d1) && !eina_iterator_next(itr, &d2))
+          {
+             rtp = eolian_parameter_type_get((Eolian_Function_Parameter *)d1);
+             var_as_ret = EINA_TRUE;
+          }
+        eina_iterator_free(itr);
+     }
+
+   Eolian_Object_Scope fsc = eolian_function_scope_get(fid, ftype);
+
+   if (eolian_function_is_beta(fid))
+     eina_strbuf_append_printf(buf, "#ifdef %s_BETA\n", cnameu);
+   if (fsc == EOLIAN_SCOPE_PROTECTED)
+     eina_strbuf_append_printf(buf, "#ifdef %s_PROTECTED\n", cnameu);
+
+   eina_strbuf_append(buf, "EOAPI ");
+   if (rtp)
+     {
+        Eina_Stringshare *rtps = eolian_type_c_type_get(rtp);
+        eina_strbuf_append(buf, rtps);
+        if (rtps[strlen(rtps) - 1] != '*')
+          eina_strbuf_append_char(buf, ' ');
+        eina_stringshare_del(rtps);
+     }
+   else
+     eina_strbuf_append(buf, "void ");
+
+   eina_strbuf_append(buf, fcn);
+   eina_stringshare_del(fcn);
+
+   eina_strbuf_append_char(buf, '(');
+   if ((ftype == EOLIAN_PROP_GET) || eolian_function_object_is_const(fid)
+       || eolian_function_is_class(fid))
+     {
+        eina_strbuf_append(buf, "const ");
+     }
+   eina_strbuf_append(buf, "Eo *obj");
+
+   {
+      Eolian_Function_Parameter *pr = NULL;
+      Eina_Iterator *itr = eolian_property_keys_get(fid, ftype);
+      EINA_ITERATOR_FOREACH(itr, pr)
+        {
+           const Eolian_Type *prt = eolian_parameter_type_get(pr);
+           const char *prn = eolian_parameter_name_get(pr);
+           Eina_Stringshare *prtn = eolian_type_c_type_get(prt);
+           eina_strbuf_append_printf(buf, ", %s %s", prtn, prn);
+           eina_stringshare_del(prtn);
+        }
+      eina_iterator_free(itr);
+   }
+
+   if (!var_as_ret)
+     {
+        Eina_Iterator *itr = NULL;
+        if (ftype == EOLIAN_PROP_GET || ftype == EOLIAN_PROP_SET)
+          itr = eolian_property_values_get(fid, ftype);
+        else
+          itr = eolian_function_parameters_get(fid);
+
+        Eolian_Function_Parameter *pr = NULL;
+        EINA_ITERATOR_FOREACH(itr, pr)
+          {
+             const Eolian_Type *prt = eolian_parameter_type_get(pr);
+             const char *prn = eolian_parameter_name_get(pr);
+             Eina_Stringshare *prtn = eolian_type_c_type_get(prt);
+
+             eina_strbuf_append(buf, ", ");
+             eina_strbuf_append(buf, prtn);
+             if (!strchr(prtn, '*'))
+               eina_strbuf_append_char(buf, ' ');
+             eina_strbuf_append(buf,
+                 _get_add_star(ftype, eolian_parameter_direction_get(pr)));
+             eina_strbuf_append(buf, prn);
+             eina_stringshare_del(prtn);
+          }
+
+        eina_iterator_free(itr);
+     }
+
+   eina_strbuf_append(buf, ");\n");
+
+   if (eolian_function_is_beta(fid))
+     eina_strbuf_append_printf(buf, "#endif\n");
+   if (fsc == EOLIAN_SCOPE_PROTECTED)
+     eina_strbuf_append_printf(buf, "#endif\n");
 }
 
 void
@@ -71,14 +177,14 @@ eo_gen_header_gen(const Eolian_Class *cl, Eina_Strbuf *buf, Eina_Bool legacy)
              {
               case EOLIAN_PROP_GET:
               case EOLIAN_PROP_SET:
-                _gen_func(cl, fid, ftype, buf);
+                _gen_func(fid, ftype, buf, cnameu, legacy);
                 break;
               case EOLIAN_PROPERTY:
-                _gen_func(cl, fid, EOLIAN_PROP_SET, buf);
-                _gen_func(cl, fid, EOLIAN_PROP_GET, buf);
+                _gen_func(fid, EOLIAN_PROP_SET, buf, cnameu, legacy);
+                _gen_func(fid, EOLIAN_PROP_GET, buf, cnameu, legacy);
                 break;
               default:
-                _gen_func(cl, fid, EOLIAN_UNRESOLVED, buf);
+                _gen_func(fid, EOLIAN_UNRESOLVED, buf, cnameu, legacy);
              }
         }
       eina_iterator_free(itr);
@@ -99,15 +205,13 @@ events:
 
            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);
+                eina_strbuf_append_printf(buf, "\n#ifdef %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);
+                eina_strbuf_append_printf(buf, "#ifdef %s_PROTECTED\n", cnameu);
              }
 
            if (!eolian_event_is_beta(ev) && evs == EOLIAN_SCOPE_PUBLIC)