2014-09-23 12:48:16 -07:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include "config.h"
|
|
|
|
#endif
|
|
|
|
|
2014-07-10 04:15:29 -07:00
|
|
|
#include <Eina.h>
|
2014-08-07 08:29:03 -07:00
|
|
|
#include "eo_lexer.h"
|
2014-07-10 04:15:29 -07:00
|
|
|
|
|
|
|
void
|
2014-07-10 06:44:17 -07:00
|
|
|
database_type_del(Eolian_Type *tp)
|
2014-07-10 04:15:29 -07:00
|
|
|
{
|
2014-07-10 06:44:17 -07:00
|
|
|
if (!tp) return;
|
2014-07-22 02:39:34 -07:00
|
|
|
const char *sp;
|
|
|
|
Eolian_Type *stp;
|
2014-08-07 07:15:07 -07:00
|
|
|
if (tp->base.file) eina_stringshare_del(tp->base.file);
|
2014-07-22 02:39:34 -07:00
|
|
|
if (tp->subtypes) EINA_LIST_FREE(tp->subtypes, stp)
|
|
|
|
database_type_del(stp);
|
|
|
|
if (tp->base_type)
|
|
|
|
database_type_del(tp->base_type);
|
|
|
|
if (tp->name) eina_stringshare_del(tp->name);
|
|
|
|
if (tp->full_name) eina_stringshare_del(tp->full_name);
|
|
|
|
if (tp->fields) eina_hash_free(tp->fields);
|
2014-08-24 06:22:02 -07:00
|
|
|
if (tp->field_list) eina_list_free(tp->field_list);
|
2014-07-22 02:39:34 -07:00
|
|
|
if (tp->namespaces) EINA_LIST_FREE(tp->namespaces, sp)
|
2014-08-12 08:29:02 -07:00
|
|
|
eina_stringshare_del(sp);
|
2014-07-22 02:39:34 -07:00
|
|
|
if (tp->comment) eina_stringshare_del(tp->comment);
|
2014-08-11 06:56:50 -07:00
|
|
|
if (tp->legacy) eina_stringshare_del(tp->legacy);
|
2014-08-19 07:55:31 -07:00
|
|
|
if (tp->freefunc) eina_stringshare_del(tp->freefunc);
|
2014-07-10 06:44:17 -07:00
|
|
|
free(tp);
|
2014-07-10 04:15:29 -07:00
|
|
|
}
|
|
|
|
|
2014-07-22 02:39:34 -07:00
|
|
|
void
|
|
|
|
database_typedef_del(Eolian_Type *tp)
|
|
|
|
{
|
|
|
|
if (!tp) return;
|
|
|
|
Eolian_Type *btp = tp->base_type;
|
2014-08-12 06:25:53 -07:00
|
|
|
/* prevent deletion of named structs/enums as they're deleted later on */
|
|
|
|
if (btp)
|
|
|
|
{
|
|
|
|
if (btp->type == EOLIAN_TYPE_ENUM)
|
|
|
|
tp->base_type = NULL;
|
2014-08-13 08:43:18 -07:00
|
|
|
else if ((btp->type == EOLIAN_TYPE_STRUCT
|
|
|
|
|| btp->type == EOLIAN_TYPE_STRUCT_OPAQUE) && btp->name)
|
2014-08-12 06:25:53 -07:00
|
|
|
tp->base_type = NULL;
|
|
|
|
}
|
2014-07-22 02:39:34 -07:00
|
|
|
database_type_del(tp);
|
|
|
|
}
|
|
|
|
|
2014-09-12 06:20:52 -07:00
|
|
|
void
|
2014-07-21 08:53:25 -07:00
|
|
|
database_type_add(Eolian_Type *def)
|
2014-07-10 04:15:29 -07:00
|
|
|
{
|
2014-07-21 08:57:45 -07:00
|
|
|
eina_hash_set(_aliases, def->full_name, def);
|
2014-08-08 07:19:52 -07:00
|
|
|
eina_hash_set(_aliasesf, def->base.file, eina_list_append
|
|
|
|
((Eina_List*)eina_hash_find(_aliasesf, def->base.file), def));
|
2014-07-10 04:15:29 -07:00
|
|
|
}
|
|
|
|
|
2014-09-12 06:20:52 -07:00
|
|
|
void
|
|
|
|
database_struct_add(Eolian_Type *tp)
|
2014-07-10 04:15:29 -07:00
|
|
|
{
|
2014-07-21 08:57:45 -07:00
|
|
|
eina_hash_set(_structs, tp->full_name, tp);
|
2014-08-08 07:19:52 -07:00
|
|
|
eina_hash_set(_structsf, tp->base.file, eina_list_append
|
|
|
|
((Eina_List*)eina_hash_find(_structsf, tp->base.file), tp));
|
2014-07-10 04:15:29 -07:00
|
|
|
}
|
|
|
|
|
2014-09-12 06:20:52 -07:00
|
|
|
void
|
|
|
|
database_enum_add(Eolian_Type *tp)
|
2014-08-12 06:25:53 -07:00
|
|
|
{
|
|
|
|
eina_hash_set(_enums, tp->full_name, tp);
|
|
|
|
eina_hash_set(_enumsf, tp->base.file, eina_list_append
|
|
|
|
((Eina_List*)eina_hash_find(_enumsf, tp->base.file), tp));
|
|
|
|
}
|
|
|
|
|
2014-07-10 04:15:29 -07:00
|
|
|
static void
|
|
|
|
_stype_to_str(const Eolian_Type *tp, Eina_Strbuf *buf, const char *name)
|
|
|
|
{
|
2014-10-01 06:34:33 -07:00
|
|
|
Eolian_Struct_Type_Field *sf;
|
2014-08-12 07:07:46 -07:00
|
|
|
Eina_List *l;
|
2014-07-10 04:15:29 -07:00
|
|
|
eina_strbuf_append(buf, "struct ");
|
|
|
|
if (tp->name)
|
|
|
|
{
|
2014-08-21 01:25:19 -07:00
|
|
|
Eina_List *m;
|
2014-07-21 08:08:06 -07:00
|
|
|
const char *sp;
|
2014-08-21 01:25:19 -07:00
|
|
|
EINA_LIST_FOREACH(tp->namespaces, m, sp)
|
2014-07-21 08:08:06 -07:00
|
|
|
{
|
|
|
|
eina_strbuf_append(buf, sp);
|
|
|
|
eina_strbuf_append_char(buf, '_');
|
|
|
|
}
|
2014-07-10 04:15:29 -07:00
|
|
|
eina_strbuf_append(buf, tp->name);
|
|
|
|
eina_strbuf_append_char(buf, ' ');
|
|
|
|
}
|
2014-08-13 08:43:18 -07:00
|
|
|
if (tp->type == EOLIAN_TYPE_STRUCT_OPAQUE)
|
|
|
|
goto append_name;
|
2014-07-10 04:15:29 -07:00
|
|
|
eina_strbuf_append(buf, "{ ");
|
2014-10-01 06:34:33 -07:00
|
|
|
EINA_LIST_FOREACH(tp->field_list, l, sf)
|
2014-08-12 07:07:46 -07:00
|
|
|
{
|
2014-10-01 06:34:33 -07:00
|
|
|
database_type_to_str(sf->type, buf, sf->name);
|
2014-08-12 07:07:46 -07:00
|
|
|
eina_strbuf_append(buf, "; ");
|
|
|
|
}
|
2014-07-10 04:15:29 -07:00
|
|
|
eina_strbuf_append(buf, "}");
|
2014-08-13 08:43:18 -07:00
|
|
|
append_name:
|
2014-07-10 04:15:29 -07:00
|
|
|
if (name)
|
|
|
|
{
|
|
|
|
eina_strbuf_append_char(buf, ' ');
|
|
|
|
eina_strbuf_append(buf, name);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-08-12 06:48:31 -07:00
|
|
|
static void
|
|
|
|
_etype_to_str(const Eolian_Type *tp, Eina_Strbuf *buf, const char *name)
|
|
|
|
{
|
2014-10-01 06:34:33 -07:00
|
|
|
Eolian_Enum_Type_Field *ef;
|
2014-08-12 07:07:46 -07:00
|
|
|
Eina_List *l;
|
2014-08-12 06:48:31 -07:00
|
|
|
eina_strbuf_append(buf, "enum ");
|
|
|
|
if (tp->name)
|
|
|
|
{
|
2014-08-21 01:25:19 -07:00
|
|
|
Eina_List *m;
|
2014-08-12 06:48:31 -07:00
|
|
|
const char *sp;
|
2014-08-21 01:25:19 -07:00
|
|
|
EINA_LIST_FOREACH(tp->namespaces, m, sp)
|
2014-08-12 06:48:31 -07:00
|
|
|
{
|
|
|
|
eina_strbuf_append(buf, sp);
|
|
|
|
eina_strbuf_append_char(buf, '_');
|
|
|
|
}
|
|
|
|
eina_strbuf_append(buf, tp->name);
|
|
|
|
eina_strbuf_append_char(buf, ' ');
|
|
|
|
}
|
|
|
|
eina_strbuf_append(buf, "{ ");
|
2014-10-01 06:34:33 -07:00
|
|
|
EINA_LIST_FOREACH(tp->field_list, l, ef)
|
2014-08-12 07:07:46 -07:00
|
|
|
{
|
2014-10-01 06:34:33 -07:00
|
|
|
eina_strbuf_append(buf, ef->name);
|
2014-08-12 07:07:46 -07:00
|
|
|
if (ef->value)
|
|
|
|
{
|
2014-08-18 05:12:08 -07:00
|
|
|
Eolian_Value val = eolian_expression_eval(ef->value,
|
|
|
|
EOLIAN_MASK_INT);
|
2014-08-12 07:07:46 -07:00
|
|
|
const char *ret;
|
|
|
|
eina_strbuf_append(buf, " = ");
|
2014-08-18 05:12:08 -07:00
|
|
|
ret = eolian_expression_value_to_literal(&val);
|
2014-08-12 07:07:46 -07:00
|
|
|
eina_strbuf_append(buf, ret);
|
|
|
|
eina_stringshare_del(ret);
|
|
|
|
}
|
2014-08-22 08:17:33 -07:00
|
|
|
if (l != eina_list_last(tp->field_list))
|
2014-08-12 07:07:46 -07:00
|
|
|
eina_strbuf_append(buf, ", ");
|
|
|
|
}
|
2014-08-12 08:29:02 -07:00
|
|
|
eina_strbuf_append(buf, " }");
|
2014-08-12 06:48:31 -07:00
|
|
|
if (name)
|
|
|
|
{
|
|
|
|
eina_strbuf_append_char(buf, ' ');
|
|
|
|
eina_strbuf_append(buf, name);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-07-22 04:11:06 -07:00
|
|
|
static void
|
|
|
|
_atype_to_str(const Eolian_Type *tp, Eina_Strbuf *buf)
|
|
|
|
{
|
|
|
|
Eina_Strbuf *fulln = eina_strbuf_new();
|
|
|
|
Eina_List *l;
|
|
|
|
const char *sp;
|
|
|
|
|
|
|
|
eina_strbuf_append(buf, "typedef ");
|
|
|
|
|
|
|
|
EINA_LIST_FOREACH(tp->namespaces, l, sp)
|
|
|
|
{
|
|
|
|
eina_strbuf_append(fulln, sp);
|
|
|
|
eina_strbuf_append_char(fulln, '_');
|
|
|
|
}
|
|
|
|
eina_strbuf_append(fulln, tp->name);
|
|
|
|
|
|
|
|
database_type_to_str(tp->base_type, buf, eina_strbuf_string_get(fulln));
|
|
|
|
eina_strbuf_free(fulln);
|
|
|
|
}
|
|
|
|
|
2014-07-10 05:13:46 -07:00
|
|
|
void
|
|
|
|
database_type_to_str(const Eolian_Type *tp, Eina_Strbuf *buf, const char *name)
|
2014-07-10 04:15:29 -07:00
|
|
|
{
|
2014-07-22 04:11:06 -07:00
|
|
|
if (tp->type == EOLIAN_TYPE_ALIAS)
|
|
|
|
{
|
|
|
|
_atype_to_str(tp, buf);
|
|
|
|
return;
|
|
|
|
}
|
2014-08-13 08:43:18 -07:00
|
|
|
else if (tp->type == EOLIAN_TYPE_STRUCT
|
|
|
|
|| tp->type == EOLIAN_TYPE_STRUCT_OPAQUE)
|
2014-07-10 04:15:29 -07:00
|
|
|
{
|
|
|
|
_stype_to_str(tp, buf, name);
|
|
|
|
return;
|
|
|
|
}
|
2014-08-12 06:48:31 -07:00
|
|
|
else if (tp->type == EOLIAN_TYPE_ENUM)
|
|
|
|
{
|
|
|
|
_etype_to_str(tp, buf, name);
|
|
|
|
return;
|
|
|
|
}
|
2014-07-10 04:15:29 -07:00
|
|
|
if ((tp->type == EOLIAN_TYPE_REGULAR
|
2014-09-08 06:52:49 -07:00
|
|
|
|| tp->type == EOLIAN_TYPE_COMPLEX
|
2014-07-30 03:57:11 -07:00
|
|
|
|| tp->type == EOLIAN_TYPE_VOID
|
|
|
|
|| tp->type == EOLIAN_TYPE_CLASS)
|
2014-07-10 04:15:29 -07:00
|
|
|
&& tp->is_const)
|
|
|
|
{
|
|
|
|
eina_strbuf_append(buf, "const ");
|
|
|
|
}
|
2014-08-12 06:48:31 -07:00
|
|
|
if (tp->type == EOLIAN_TYPE_REGULAR
|
2014-09-08 06:52:49 -07:00
|
|
|
|| tp->type == EOLIAN_TYPE_COMPLEX
|
2015-05-12 08:15:29 -07:00
|
|
|
|| tp->type == EOLIAN_TYPE_CLASS)
|
2014-07-21 08:08:06 -07:00
|
|
|
{
|
|
|
|
Eina_List *l;
|
|
|
|
const char *sp;
|
|
|
|
EINA_LIST_FOREACH(tp->namespaces, l, sp)
|
|
|
|
{
|
|
|
|
eina_strbuf_append(buf, sp);
|
|
|
|
eina_strbuf_append_char(buf, '_');
|
|
|
|
}
|
2014-08-07 08:29:03 -07:00
|
|
|
int kw = eo_lexer_keyword_str_to_id(tp->name);
|
|
|
|
if (kw) eina_strbuf_append(buf, eo_lexer_get_c_type(kw));
|
|
|
|
else eina_strbuf_append(buf, tp->name);
|
2014-07-21 08:08:06 -07:00
|
|
|
}
|
2014-07-10 04:15:29 -07:00
|
|
|
else if (tp->type == EOLIAN_TYPE_VOID)
|
|
|
|
eina_strbuf_append(buf, "void");
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Eolian_Type *btp = tp->base_type;
|
2014-07-10 05:13:46 -07:00
|
|
|
database_type_to_str(tp->base_type, buf, NULL);
|
2014-07-10 04:15:29 -07:00
|
|
|
if (btp->type != EOLIAN_TYPE_POINTER || btp->is_const)
|
|
|
|
eina_strbuf_append_char(buf, ' ');
|
|
|
|
eina_strbuf_append_char(buf, '*');
|
|
|
|
if (tp->is_const) eina_strbuf_append(buf, " const");
|
|
|
|
}
|
|
|
|
if (name)
|
|
|
|
{
|
2014-08-22 06:04:22 -07:00
|
|
|
if (tp->type != EOLIAN_TYPE_POINTER)
|
|
|
|
eina_strbuf_append_char(buf, ' ');
|
2014-07-10 04:15:29 -07:00
|
|
|
eina_strbuf_append(buf, name);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-07-22 04:11:06 -07:00
|
|
|
static void
|
|
|
|
_typedef_print(Eolian_Type *tp)
|
|
|
|
{
|
|
|
|
printf("type %s: ", tp->full_name);
|
|
|
|
database_type_print(tp->base_type);
|
|
|
|
}
|
|
|
|
|
2014-08-12 07:26:48 -07:00
|
|
|
void
|
|
|
|
database_expr_print(Eolian_Expression *exp)
|
|
|
|
{
|
2014-08-18 05:12:08 -07:00
|
|
|
Eolian_Value val = eolian_expression_eval(exp, EOLIAN_MASK_ALL);
|
|
|
|
const char *ret = eolian_expression_value_to_literal(&val);
|
2014-08-12 07:26:48 -07:00
|
|
|
printf("%s", ret);
|
|
|
|
eina_stringshare_del(ret);
|
|
|
|
}
|
|
|
|
|
2014-07-10 04:15:29 -07:00
|
|
|
void
|
|
|
|
database_type_print(Eolian_Type *tp)
|
|
|
|
{
|
2014-07-22 04:11:06 -07:00
|
|
|
if (tp->type == EOLIAN_TYPE_ALIAS)
|
|
|
|
{
|
|
|
|
_typedef_print(tp);
|
|
|
|
return;
|
|
|
|
}
|
2014-07-10 04:15:29 -07:00
|
|
|
if (tp->is_own)
|
2014-07-11 04:26:33 -07:00
|
|
|
printf("own(");
|
2014-07-10 04:15:29 -07:00
|
|
|
if (tp->is_const)
|
2014-07-11 04:26:33 -07:00
|
|
|
printf("const(");
|
2014-09-08 06:52:49 -07:00
|
|
|
if (tp->type == EOLIAN_TYPE_REGULAR || tp->type == EOLIAN_TYPE_COMPLEX
|
|
|
|
|| tp->type == EOLIAN_TYPE_CLASS)
|
2014-07-22 04:11:06 -07:00
|
|
|
printf("%s", tp->full_name);
|
2014-07-11 04:26:33 -07:00
|
|
|
else if (tp->type == EOLIAN_TYPE_VOID)
|
|
|
|
printf("void");
|
2015-05-12 08:15:29 -07:00
|
|
|
else if (tp->type == EOLIAN_TYPE_STRUCT_OPAQUE)
|
2014-07-22 04:11:06 -07:00
|
|
|
printf("struct %s", tp->full_name);
|
2014-07-10 04:15:29 -07:00
|
|
|
else if (tp->type == EOLIAN_TYPE_POINTER)
|
|
|
|
{
|
|
|
|
database_type_print(tp->base_type);
|
|
|
|
putchar('*');
|
|
|
|
}
|
|
|
|
else if (tp->type == EOLIAN_TYPE_STRUCT)
|
|
|
|
{
|
2014-10-01 06:34:33 -07:00
|
|
|
Eolian_Struct_Type_Field *sf;
|
2014-08-21 01:25:19 -07:00
|
|
|
Eina_List *m;
|
2014-07-11 04:26:33 -07:00
|
|
|
printf("struct ");
|
2014-08-12 06:48:31 -07:00
|
|
|
if (tp->full_name) printf("%s ", tp->full_name);
|
2014-07-11 04:26:33 -07:00
|
|
|
printf("{ ");
|
2014-10-01 06:34:33 -07:00
|
|
|
EINA_LIST_FOREACH(tp->field_list, m, sf)
|
2014-08-12 07:07:46 -07:00
|
|
|
{
|
2014-10-01 06:34:33 -07:00
|
|
|
printf("%s: ", sf->name);
|
2014-08-12 07:07:46 -07:00
|
|
|
database_type_print(sf->type);
|
|
|
|
printf("; ");
|
|
|
|
}
|
2014-07-11 04:26:33 -07:00
|
|
|
printf("}");
|
2014-07-10 04:15:29 -07:00
|
|
|
}
|
2014-08-12 06:48:31 -07:00
|
|
|
else if (tp->type == EOLIAN_TYPE_ENUM)
|
|
|
|
{
|
2014-10-01 06:34:33 -07:00
|
|
|
Eolian_Enum_Type_Field *ef;
|
2014-08-21 01:25:19 -07:00
|
|
|
Eina_List *m;
|
2014-08-12 06:48:31 -07:00
|
|
|
printf("enum %s ", tp->full_name);
|
|
|
|
printf("{ ");
|
2014-10-01 06:34:33 -07:00
|
|
|
EINA_LIST_FOREACH(tp->field_list, m, ef)
|
2014-08-12 07:07:46 -07:00
|
|
|
{
|
2014-10-01 06:34:33 -07:00
|
|
|
printf("%s", ef->name);
|
2014-08-12 07:07:46 -07:00
|
|
|
if (ef->value)
|
|
|
|
{
|
|
|
|
printf(" = ");
|
2014-08-12 07:26:48 -07:00
|
|
|
database_expr_print(ef->value);
|
2014-08-12 07:07:46 -07:00
|
|
|
}
|
2014-08-22 08:17:33 -07:00
|
|
|
if (m != eina_list_last(tp->field_list))
|
2014-08-12 07:07:46 -07:00
|
|
|
printf(", ");
|
|
|
|
}
|
2014-08-12 08:29:02 -07:00
|
|
|
printf(" }");
|
2014-08-12 06:48:31 -07:00
|
|
|
}
|
2014-07-10 04:15:29 -07:00
|
|
|
if (tp->is_own)
|
|
|
|
putchar(')');
|
|
|
|
if (tp->is_const)
|
|
|
|
putchar(')');
|
|
|
|
}
|