forked from enlightenment/efl
eolian: stub header generator
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.
This commit is contained in:
parent
18410e17ef
commit
d09262b011
|
@ -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);
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue