eolian: stub header generator
authorDaniel Kolesa <d.kolesa@samsung.com>
Tue, 26 Aug 2014 16:08:26 +0000 (17:08 +0100)
committerDaniel Kolesa <d.kolesa@samsung.com>
Tue, 26 Aug 2014 16:10:14 +0000 (17:10 +0100)
This adds functionality into eolian_gen to generate a "stub header".
The main use for this is to deal with cyclic dependencies between Eo files.

src/bin/eolian/main.c
src/bin/eolian/types_generator.c
src/bin/eolian/types_generator.h

index 0873182..d4e3c37 100644 (file)
@@ -116,7 +116,7 @@ _generate_eo_header_file(char *filename, const char *eo_filename)
 
    Eina_Strbuf *buffer = eina_strbuf_new();
 
-   if (!types_header_generate(eo_filename, buffer))
+   if (!types_header_generate(eo_filename, buffer, EINA_TRUE))
      {
         ERR("Failed to generate types of file %s", eo_filename);
         goto end;
@@ -155,6 +155,36 @@ end:
 }
 
 static Eina_Bool
+_generate_stub_header_file(char *filename, const char *eo_filename)
+{
+   Eina_Bool ret = EINA_FALSE;
+
+   Eina_Strbuf *buffer = eina_strbuf_new();
+
+   if (!types_header_generate(eo_filename, buffer, EINA_FALSE))
+     {
+        ERR("Failed to generate types of file %s", eo_filename);
+        goto end;
+     }
+
+   Eina_Strbuf *ctbuf = eina_strbuf_new();
+   if (types_class_typedef_generate(eo_filename, ctbuf))
+     {
+        eina_strbuf_append_char(ctbuf, '\n');
+        eina_strbuf_prepend(buffer, eina_strbuf_string_get(ctbuf));
+     }
+   eina_strbuf_free(ctbuf);
+
+   buffer = _include_guard_enclose(_filename_get(filename), "STUBS", buffer);
+   if (_write_file(filename, buffer, EINA_FALSE))
+      ret = EINA_TRUE;
+end:
+   eina_strbuf_free(buffer);
+
+   return ret;
+}
+
+static Eina_Bool
 _generate_c_file(char *filename, const char *eo_filename, Eina_Bool legacy_support)
 {
    Eina_Bool ret = EINA_FALSE;
@@ -221,7 +251,7 @@ _generate_legacy_header_file(char *filename, const char *eo_filename)
 
    Eina_Strbuf *buffer = eina_strbuf_new();
 
-   if (!types_header_generate(eo_filename, buffer))
+   if (!types_header_generate(eo_filename, buffer, EINA_TRUE))
      {
         ERR("Failed to generate types of file %s", eo_filename);
         goto end;
@@ -262,6 +292,7 @@ enum
 {
    NO_WAY_GEN,
    H_GEN,
+   H_STUB_GEN,
    C_GEN,
    C_IMPL_GEN
 };
@@ -301,6 +332,7 @@ int main(int argc, char **argv)
           {"gh",         no_argument,         &gen_opt, H_GEN},
           {"gc",         no_argument,         &gen_opt, C_GEN},
           {"gi",         no_argument,         &gen_opt, C_IMPL_GEN},
+          {"gs",         no_argument,         &gen_opt, H_STUB_GEN},
           {"output",     required_argument,   0, 'o'},
           {"legacy",     no_argument,         &legacy_support, 1},
           {"include",    required_argument,   0, 'I'},
@@ -341,6 +373,7 @@ int main(int argc, char **argv)
         printf("       --output/-o Force output filename to 'outfile'\n");
         printf("       --eo Set generator to eo mode. Must be specified\n");
         printf("       --gh Generate C header file [.h]\n");
+        printf("       --gs Generate C type stubs [.h]\n");
         printf("       --gc Generate C source file [.c]\n");
         printf("       --gi Generate C implementation source file [.c]. The output will be a series of functions that have to be filled.\n");
         printf("       --legacy Generate legacy\n");
@@ -400,6 +433,12 @@ int main(int argc, char **argv)
                      ret = ( _generate_eo_header_file(output_filename, eo_file_basename) ? 0 : 1 );
                    break;
                 }
+           case H_STUB_GEN:
+                {
+                   INF("Generating stubs header file %s\n", output_filename);
+                   ret = _generate_stub_header_file(output_filename, eo_file_basename) ? 0 : 1;
+                   break;
+                }
            case C_GEN:
                 {
                    INF("Generating source file %s\n", output_filename);
index acd8d5e..c732df1 100644 (file)
@@ -37,7 +37,7 @@ _desc_generate(const char *desc, Eina_Strbuf *buf)
 }
 
 static Eina_Strbuf *
-_type_generate(const Eolian_Type *tp, Eina_Bool in_typedef)
+_type_generate(const Eolian_Type *tp, Eina_Bool in_typedef, Eina_Bool full)
 {
    Eina_Strbuf *buf = eina_strbuf_new();
    _desc_generate(eolian_type_description_get(tp), buf);
@@ -50,8 +50,13 @@ _type_generate(const Eolian_Type *tp, Eina_Bool in_typedef)
               Eolian_Type_Type base_tp_type = eolian_type_type_get(base_tp);
               if (base_tp_type == EOLIAN_TYPE_STRUCT || base_tp_type == EOLIAN_TYPE_ENUM)
                 {
+                   if (!full && !eolian_type_name_get(base_tp))
+                     {
+                        eina_strbuf_free(buf);
+                        return NULL;
+                     }
                    const char *name = eolian_type_name_get(tp);
-                   Eina_Strbuf *struct_buf = _type_generate(base_tp, EINA_TRUE);
+                   Eina_Strbuf *struct_buf = _type_generate(base_tp, EINA_TRUE, full);
                    eina_strbuf_append_printf(buf, "typedef %s%s%s",
                          eina_strbuf_string_get(struct_buf),
                          name?" ":"", name?name:"");
@@ -71,7 +76,7 @@ _type_generate(const Eolian_Type *tp, Eina_Bool in_typedef)
            {
               const Eolian_Struct_Type_Field *member;
               char *name = _concat_name(tp);
-              if ((in_typedef && name) || tp_type == EOLIAN_TYPE_STRUCT_OPAQUE)
+              if ((in_typedef && name) || tp_type == EOLIAN_TYPE_STRUCT_OPAQUE || !full)
                 {
                    eina_strbuf_append_printf(buf, "struct %s", name);
                    free(name);
@@ -99,6 +104,8 @@ _type_generate(const Eolian_Type *tp, Eina_Bool in_typedef)
            {
               const Eolian_Enum_Type_Field *member;
               char *name = _concat_name(tp);
+              if (!full)
+                break;
               if (in_typedef)
                 {
                    eina_strbuf_append_printf(buf, "enum %s", name);
@@ -165,7 +172,7 @@ _type_generate(const Eolian_Type *tp, Eina_Bool in_typedef)
 }
 
 Eina_Bool
-types_header_generate(const char *eo_filename, Eina_Strbuf *buf)
+types_header_generate(const char *eo_filename, Eina_Strbuf *buf, Eina_Bool full)
 {
    const Eolian_Type *tp;
 
@@ -173,7 +180,7 @@ types_header_generate(const char *eo_filename, Eina_Strbuf *buf)
    Eina_Iterator *itr = eolian_type_aliases_get_by_file(eo_filename);
    EINA_ITERATOR_FOREACH(itr, tp)
      {
-        Eina_Strbuf *type_buf = _type_generate(tp, EINA_TRUE);
+        Eina_Strbuf *type_buf = _type_generate(tp, EINA_TRUE, full);
         if (type_buf)
           {
              eina_strbuf_append(buf, eina_strbuf_string_get(type_buf));
@@ -187,7 +194,7 @@ types_header_generate(const char *eo_filename, Eina_Strbuf *buf)
    itr = eolian_type_structs_get_by_file(eo_filename);
    EINA_ITERATOR_FOREACH(itr, tp)
      {
-        Eina_Strbuf *type_buf = _type_generate(tp, EINA_FALSE);
+        Eina_Strbuf *type_buf = _type_generate(tp, EINA_FALSE, full);
         if (type_buf)
           {
              eina_strbuf_append(buf, eina_strbuf_string_get(type_buf));
@@ -197,11 +204,14 @@ types_header_generate(const char *eo_filename, Eina_Strbuf *buf)
      }
    eina_iterator_free(itr);
 
+   if (!full)
+     return EINA_TRUE;
+
    /* Generation of enums */
    itr = eolian_type_enums_get_by_file(eo_filename);
    EINA_ITERATOR_FOREACH(itr, tp)
      {
-        Eina_Strbuf *type_buf = _type_generate(tp, EINA_FALSE);
+        Eina_Strbuf *type_buf = _type_generate(tp, EINA_FALSE, EINA_TRUE);
         if (type_buf)
           {
              eina_strbuf_append(buf, eina_strbuf_string_get(type_buf));
index 2e07b20..84eb15d 100644 (file)
@@ -8,11 +8,12 @@
  *
  * @param[in] eo_filename Eo filename
  * @param[inout] buf buffer to fill
+ * @param[in]full whether to generate full type definitions
  *
  * @return EINA_TRUE on success, EINA_FALSE on error.
  *
  */
-Eina_Bool types_header_generate(const char *eo_filename, Eina_Strbuf *buf);
+Eina_Bool types_header_generate(const char *eo_filename, Eina_Strbuf *buf, Eina_Bool full);
 
 Eina_Bool types_class_typedef_generate(const char *eo_filename, Eina_Strbuf *buf);