diff --git a/src/bin/eolian/main.c b/src/bin/eolian/main.c index 0873182117..d4e3c373f1 100644 --- a/src/bin/eolian/main.c +++ b/src/bin/eolian/main.c @@ -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; @@ -154,6 +154,36 @@ end: return ret; } +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) { @@ -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); diff --git a/src/bin/eolian/types_generator.c b/src/bin/eolian/types_generator.c index acd8d5e06c..c732df13d0 100644 --- a/src/bin/eolian/types_generator.c +++ b/src/bin/eolian/types_generator.c @@ -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)); diff --git a/src/bin/eolian/types_generator.h b/src/bin/eolian/types_generator.h index 2e07b2057f..84eb15dd25 100644 --- a/src/bin/eolian/types_generator.h +++ b/src/bin/eolian/types_generator.h @@ -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);