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;
}
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;
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;
{
NO_WAY_GEN,
H_GEN,
+ H_STUB_GEN,
C_GEN,
C_IMPL_GEN
};
{"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'},
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");
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);
}
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);
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:"");
{
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);
{
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);
}
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;
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));
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));
}
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));