diff --git a/src/Makefile_Eolian.am b/src/Makefile_Eolian.am index 8df6a9d83d..767cc76b39 100644 --- a/src/Makefile_Eolian.am +++ b/src/Makefile_Eolian.am @@ -31,7 +31,9 @@ lib_eolian_libeolian_la_SOURCES = \ lib/eolian/database_event_api.c \ lib/eolian/database_print.c \ lib/eolian/database_expr.c \ - lib/eolian/database_expr_api.c + lib/eolian/database_expr_api.c \ + lib/eolian/database_var.c \ + lib/eolian/database_var_api.c lib_eolian_libeolian_la_CPPFLAGS = -I$(top_builddir)/src/lib/efl @EOLIAN_CFLAGS@ \ -DPACKAGE_DATA_DIR=\"$(datadir)/eolian\" diff --git a/src/lib/eolian/Eolian.h b/src/lib/eolian/Eolian.h index 59eaad5748..8f50fbd4ea 100644 --- a/src/lib/eolian/Eolian.h +++ b/src/lib/eolian/Eolian.h @@ -80,6 +80,12 @@ typedef struct _Eolian_Event Eolian_Event; */ typedef struct _Eolian_Expression Eolian_Expression; +/* Variable information + * + * @ingroup Eolian + */ +typedef struct _Eolian_Variable Eolian_Variable; + #define EOLIAN_LEGACY "legacy" #define EOLIAN_LEGACY_GET "legacy_get" #define EOLIAN_LEGACY_SET "legacy_set" @@ -169,6 +175,13 @@ typedef enum | EOLIAN_MASK_NULL } Eolian_Expression_Mask; +typedef enum +{ + EOLIAN_VAR_UNKNOWN = 0, + EOLIAN_VAR_CONSTANT, + EOLIAN_VAR_GLOBAL +} Eolian_Variable_Type; + /* * @brief Parse a given .eo file and fill the database. * diff --git a/src/lib/eolian/database_class.c b/src/lib/eolian/database_class.c index 9dc5eee795..a93a1049cc 100644 --- a/src/lib/eolian/database_class.c +++ b/src/lib/eolian/database_class.c @@ -30,7 +30,6 @@ database_class_del(Eolian_Class *cl) eina_stringshare_del(cl->name); eina_stringshare_del(cl->full_name); - eina_stringshare_del(cl->file); eina_stringshare_del(cl->description); eina_stringshare_del(cl->legacy_prefix); eina_stringshare_del(cl->eo_prefix); @@ -70,14 +69,6 @@ database_class_add(const char *class_name, Eolian_Class_Type type) return cl; } -void -database_class_file_set(Eolian_Class *cl, const char *file_name) -{ - EINA_SAFETY_ON_NULL_RETURN(cl); - cl->file = eina_stringshare_add(file_name); - eina_hash_set(_classesf, cl->file, cl); -} - /* * ret false -> clash, class = NULL * ret true && class -> only one class corresponding diff --git a/src/lib/eolian/database_class_api.c b/src/lib/eolian/database_class_api.c index 4d5efa58e5..2b785184a3 100644 --- a/src/lib/eolian/database_class_api.c +++ b/src/lib/eolian/database_class_api.c @@ -4,7 +4,7 @@ EAPI Eina_Stringshare * eolian_class_file_get(const Eolian_Class *cl) { - return cl ? cl->file : NULL; + return cl ? cl->base.file : NULL; } EAPI Eina_Stringshare * diff --git a/src/lib/eolian/database_fill.c b/src/lib/eolian/database_fill.c index 4dd120f622..b3e2c58076 100644 --- a/src/lib/eolian/database_fill.c +++ b/src/lib/eolian/database_fill.c @@ -404,7 +404,7 @@ _db_fill_class(Eo_Class_Def *kls) const char *s; Eina_List *l; - database_class_file_set(cl, kls->file); + eina_hash_set(_classesf, kls->base.file, cl); if (kls->comment) { diff --git a/src/lib/eolian/database_type.c b/src/lib/eolian/database_type.c index 2c0347bc5b..e1af071006 100644 --- a/src/lib/eolian/database_type.c +++ b/src/lib/eolian/database_type.c @@ -18,7 +18,6 @@ database_type_del(Eolian_Type *tp) if (tp->namespaces) EINA_LIST_FREE(tp->namespaces, sp) eina_stringshare_del(sp); if (tp->comment) eina_stringshare_del(tp->comment); - if (tp->file) eina_stringshare_del(tp->file); free(tp); } @@ -38,8 +37,8 @@ database_type_add(Eolian_Type *def) { if (!_aliases) return EINA_FALSE; eina_hash_set(_aliases, def->full_name, def); - eina_hash_set(_aliasesf, def->file, eina_list_append - ((Eina_List*)eina_hash_find(_aliasesf, def->file), def)); + eina_hash_set(_aliasesf, def->base.file, eina_list_append + ((Eina_List*)eina_hash_find(_aliasesf, def->base.file), def)); return EINA_TRUE; } @@ -47,8 +46,8 @@ Eina_Bool database_struct_add(Eolian_Type *tp) { if (!_structs) return EINA_FALSE; eina_hash_set(_structs, tp->full_name, tp); - eina_hash_set(_structsf, tp->file, eina_list_append - ((Eina_List*)eina_hash_find(_structsf, tp->file), tp)); + eina_hash_set(_structsf, tp->base.file, eina_list_append + ((Eina_List*)eina_hash_find(_structsf, tp->base.file), tp)); return EINA_TRUE; } diff --git a/src/lib/eolian/database_type_api.c b/src/lib/eolian/database_type_api.c index 46ff42d35d..2fa6404ebb 100644 --- a/src/lib/eolian/database_type_api.c +++ b/src/lib/eolian/database_type_api.c @@ -127,7 +127,7 @@ eolian_type_file_get(const Eolian_Type *tp) EINA_SAFETY_ON_FALSE_RETURN_VAL(tpp != EOLIAN_TYPE_POINTER && tpp != EOLIAN_TYPE_FUNCTION && tpp != EOLIAN_TYPE_VOID, NULL); - return eina_stringshare_ref(tp->file); + return eina_stringshare_ref(tp->base.file); } EAPI const Eolian_Type * diff --git a/src/lib/eolian/database_var.c b/src/lib/eolian/database_var.c new file mode 100644 index 0000000000..e3328e9342 --- /dev/null +++ b/src/lib/eolian/database_var.c @@ -0,0 +1,39 @@ +#include +#include "eo_lexer.h" + +void +database_var_del(Eolian_Variable *var) +{ + if (!var) return; + const char *sp; + if (var->base.file) eina_stringshare_del(var->base.file); + if (var->base_type) + database_type_del(var->base_type); + if (var->name) eina_stringshare_del(var->name); + if (var->full_name) eina_stringshare_del(var->full_name); + if (var->namespaces) EINA_LIST_FREE(var->namespaces, sp) + eina_stringshare_del(sp); + if (var->value) database_expr_del(var->value); + if (var->comment) eina_stringshare_del(var->comment); + free(var); +} + +Eina_Bool +database_var_global_add(Eolian_Variable *var) +{ + if (!_globals) return EINA_FALSE; + eina_hash_set(_globals, var->full_name, var); + eina_hash_set(_globalsf, var->base.file, eina_list_append + ((Eina_List*)eina_hash_find(_globalsf, var->base.file), var)); + return EINA_TRUE; +} + +Eina_Bool +database_var_constant_add(Eolian_Variable *var) +{ + if (!_constants) return EINA_FALSE; + eina_hash_set(_constants, var->full_name, var); + eina_hash_set(_constantsf, var->base.file, eina_list_append + ((Eina_List*)eina_hash_find(_constantsf, var->base.file), var)); + return EINA_TRUE; +} diff --git a/src/lib/eolian/database_var_api.c b/src/lib/eolian/database_var_api.c new file mode 100644 index 0000000000..4d4a971e10 --- /dev/null +++ b/src/lib/eolian/database_var_api.c @@ -0,0 +1,95 @@ +#include +#include "eolian_database.h" +#include "eo_definitions.h" + +EAPI const Eolian_Variable * +eolian_variable_global_get_by_name(const char *name) +{ + if (!_globals) return NULL; + Eina_Stringshare *shr = eina_stringshare_add(name); + Eolian_Variable *v = eina_hash_find(_globals, shr); + eina_stringshare_del(shr); + return v; +} + +EAPI const Eolian_Variable * +eolian_variable_constant_get_by_name(const char *name) +{ + if (!_constants) return NULL; + Eina_Stringshare *shr = eina_stringshare_add(name); + Eolian_Variable *v = eina_hash_find(_constants, shr); + eina_stringshare_del(shr); + return v; +} + +EAPI Eina_Iterator * +eolian_variable_globals_get_by_file(const char *fname) +{ + if (!_globalsf) return NULL; + Eina_Stringshare *shr = eina_stringshare_add(fname); + Eina_List *l = eina_hash_find(_globalsf, shr); + eina_stringshare_del(shr); + if (!l) return NULL; + return eina_list_iterator_new(l); +} + +EAPI Eina_Iterator * +eolian_variable_constants_get_by_file(const char *fname) +{ + if (!_constantsf) return NULL; + Eina_Stringshare *shr = eina_stringshare_add(fname); + Eina_List *l = eina_hash_find(_constantsf, shr); + eina_stringshare_del(shr); + if (!l) return NULL; + return eina_list_iterator_new(l); +} + +EAPI Eolian_Variable_Type +eolian_variable_type_get(const Eolian_Variable *var) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(var, EOLIAN_VAR_UNKNOWN); + return var->type; +} + +EAPI Eina_Stringshare * +eolian_variable_description_get(const Eolian_Variable *var) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(var, NULL); + return eina_stringshare_ref(var->comment); +} + +EAPI Eina_Stringshare * +eolian_variable_file_get(const Eolian_Variable *var) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(var, NULL); + return eina_stringshare_ref(var->base.file); +} + +EAPI const Eolian_Type * +eolian_variable_base_type_get(const Eolian_Variable *var) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(var, NULL); + return var->base_type; +} + +EAPI Eina_Stringshare * +eolian_variable_name_get(const Eolian_Variable *var) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(var, NULL); + return eina_stringshare_ref(var->name); +} + +EAPI Eina_Stringshare * +eolian_variable_full_name_get(const Eolian_Variable *var) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(var, NULL); + return eina_stringshare_ref(var->full_name); +} + +EAPI Eina_Iterator * +eolian_variable_namespaces_get(const Eolian_Variable *var) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(var, NULL); + if (!var->namespaces) return NULL; + return eina_list_iterator_new(var->namespaces); +} diff --git a/src/lib/eolian/eo_definitions.c b/src/lib/eolian/eo_definitions.c index a8bb978d35..f400a48b24 100644 --- a/src/lib/eolian/eo_definitions.c +++ b/src/lib/eolian/eo_definitions.c @@ -113,8 +113,6 @@ eo_definitions_class_def_free(Eo_Class_Def *kls) if (kls->name) eina_stringshare_del(kls->name); - if (kls->file) - eina_stringshare_del(kls->file); if (kls->comment) eina_stringshare_del(kls->comment); if (kls->legacy_prefix) diff --git a/src/lib/eolian/eo_lexer.c b/src/lib/eolian/eo_lexer.c index 79b787ad8a..e5b072170e 100644 --- a/src/lib/eolian/eo_lexer.c +++ b/src/lib/eolian/eo_lexer.c @@ -3,6 +3,7 @@ #include #include +#include #include "eo_lexer.h" @@ -663,6 +664,16 @@ lex_balanced(Eo_Lexer *ls, Eo_Token *tok, char beg, char end) return TOK_VALUE; } +static const char * +get_filename(Eo_Lexer *ls) +{ + char *dup = strdup(ls->source); + char *s = basename(dup); + const char *file = eina_stringshare_add(s); + free(dup); + return file; +} + static void eo_lexer_set_input(Eo_Lexer *ls, const char *source) { @@ -679,6 +690,7 @@ eo_lexer_set_input(Eo_Lexer *ls, const char *source) ls->stream_end = ls->stream + eina_file_size_get(f); ls->stream_line = ls->stream; ls->source = eina_stringshare_add(source); + ls->filename = get_filename(ls); ls->line_number = 1; ls->icolumn = ls->column = 0; next_char(ls); @@ -690,9 +702,10 @@ eo_lexer_free(Eo_Lexer *ls) Eo_Node *nd; if (!ls) return; - if (ls->source) eina_stringshare_del(ls->source); - if (ls->buff ) eina_strbuf_free (ls->buff); - if (ls->handle) eina_file_close (ls->handle); + if (ls->source ) eina_stringshare_del(ls->source); + if (ls->filename) eina_stringshare_del(ls->filename); + if (ls->buff ) eina_strbuf_free (ls->buff); + if (ls->handle ) eina_file_close (ls->handle); eo_lexer_context_clear(ls); diff --git a/src/lib/eolian/eo_lexer.h b/src/lib/eolian/eo_lexer.h index 60281c24d7..042ea9f540 100644 --- a/src/lib/eolian/eo_lexer.h +++ b/src/lib/eolian/eo_lexer.h @@ -132,6 +132,8 @@ typedef struct _Eo_Lexer Eina_File *handle; /* the source file name */ const char *source; + /* only basename */ + const char *filename; /* points to the current character in our mmapped file being lexed, just * incremented until the end */ const char *stream; diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c index abf6dffdc8..98aaed47a5 100644 --- a/src/lib/eolian/eo_parser.c +++ b/src/lib/eolian/eo_parser.c @@ -1,5 +1,3 @@ -#include - #include "eo_parser.h" #define CASE_LOCK(ls, var, msg) \ @@ -125,16 +123,6 @@ append_node(Eo_Lexer *ls, int type, void *def) ls->nodes = eina_list_append(ls->nodes, nd); } -static const char * -get_filename(Eo_Lexer *ls) -{ - char *dup = strdup(ls->source); - char *s = basename(dup); - const char *file = eina_stringshare_add(s); - free(dup); - return file; -} - static Eina_Bool compare_class_file(const char *fn_ext, const char *fn_noext) { @@ -150,9 +138,9 @@ redef_error(Eo_Lexer *ls, Eolian_Type_Type type, Eolian_Type *old) { char buf[256]; char fbuf[256] = { '\0' }; - const char *file = get_filename(ls); - if (file != old->file) - snprintf(fbuf, sizeof(fbuf), " in file '%s'", old->file); + const char *file = eina_stringshare_ref(ls->filename); + if (file != old->base.file) + snprintf(fbuf, sizeof(fbuf), " in file '%s'", old->base.file); eina_stringshare_del(file); snprintf(buf, sizeof(buf), "%s '%s' redefined (originally at line %d, column %d%s)", @@ -330,7 +318,7 @@ parse_expr_simple(Eo_Lexer *ls) Eolian_Expression *exp = parse_expr_bin(ls, UNARY_PRECEDENCE); pop_expr(ls); expr = push_expr(ls); - expr->base.file = get_filename(ls); + expr->base.file = eina_stringshare_ref(ls->filename); expr->base.line = line; expr->base.column = col; expr->binop = unop; @@ -344,7 +332,7 @@ parse_expr_simple(Eo_Lexer *ls) { int line = ls->line_number, col = ls->column; expr = push_expr(ls); - expr->base.file = get_filename(ls); + expr->base.file = eina_stringshare_ref(ls->filename); expr->base.line = line; expr->base.column = col; expr->type = ls->t.kw + 1; /* map Numbers from lexer to expr type */ @@ -356,7 +344,7 @@ parse_expr_simple(Eo_Lexer *ls) { int line = ls->line_number, col = ls->column; expr = push_expr(ls); - expr->base.file = get_filename(ls); + expr->base.file = eina_stringshare_ref(ls->filename); expr->base.line = line; expr->base.column = col; expr->type = EOLIAN_EXPR_STRING; @@ -368,7 +356,7 @@ parse_expr_simple(Eo_Lexer *ls) { int line = ls->line_number, col = ls->column; expr = push_expr(ls); - expr->base.file = get_filename(ls); + expr->base.file = eina_stringshare_ref(ls->filename); expr->base.line = line; expr->base.column = col; expr->type = EOLIAN_EXPR_CHAR; @@ -406,7 +394,7 @@ parse_expr_simple(Eo_Lexer *ls) break; } } - expr->base.file = get_filename(ls); + expr->base.file = eina_stringshare_ref(ls->filename); expr->base.line = line; expr->base.column = col; break; @@ -443,7 +431,7 @@ parse_expr_bin(Eo_Lexer *ls, int min_prec) pop_expr(ls); pop_expr(ls); bin = push_expr(ls); - bin->base.file = get_filename(ls); + bin->base.file = eina_stringshare_ref(ls->filename); bin->base.line = line; bin->base.column = col; bin->binop = op; @@ -499,6 +487,7 @@ parse_function_type(Eo_Lexer *ls) { int line, col; Eolian_Type *def = push_type(ls); + def->base.file = eina_stringshare_ref(ls->filename); def->base.line = ls->line_number; def->base.column = ls->column; eo_lexer_get(ls); @@ -542,7 +531,6 @@ parse_struct(Eo_Lexer *ls, const char *name, Eina_Bool is_extern, int bline = ls->line_number, bcolumn = ls->column; Eolian_Type *def = push_type(ls); def->is_extern = is_extern; - def->file = get_filename(ls); if (name) _fill_type_name(def, name); def->type = EOLIAN_TYPE_STRUCT; def->fields = eina_hash_string_small_new(EINA_FREE_CB(_struct_field_free)); @@ -566,6 +554,7 @@ parse_struct(Eo_Lexer *ls, const char *name, Eina_Bool is_extern, check_next(ls, ':'); tp = parse_type(ls); fdef = calloc(1, sizeof(Eolian_Struct_Field)); + fdef->base.file = eina_stringshare_ref(ls->filename); fdef->base.line = fline; fdef->base.column = fcol; fdef->type = tp; @@ -580,6 +569,7 @@ parse_struct(Eo_Lexer *ls, const char *name, Eina_Bool is_extern, } } check_match(ls, '}', '{', bline, bcolumn); + def->base.file = eina_stringshare_ref(ls->filename); def->base.line = line; def->base.column = column; if (name) database_struct_add(def); @@ -604,6 +594,7 @@ parse_type_struct_void(Eo_Lexer *ls, Eina_Bool allow_struct) col = ls->column; check_next(ls, '('); def = parse_type_void(ls); + def->base.file = eina_stringshare_ref(ls->filename); def->base.line = line; def->base.column = col; def->is_const = EINA_TRUE; @@ -625,6 +616,7 @@ parse_type_struct_void(Eo_Lexer *ls, Eina_Bool allow_struct) eo_lexer_syntax_error(ls, "pointer type expected"); } eo_lexer_context_pop(ls); + def->base.file = eina_stringshare_ref(ls->filename); def->base.line = line; def->base.column = col; def->is_own = EINA_TRUE; @@ -683,6 +675,7 @@ parse_type_struct_void(Eo_Lexer *ls, Eina_Bool allow_struct) break; } def = push_type(ls); + def->base.file = eina_stringshare_ref(ls->filename); def->base.line = line; def->base.column = col; if (ls->t.kw == KW_void) @@ -708,7 +701,7 @@ parse_type_struct_void(Eo_Lexer *ls, Eina_Bool allow_struct) eo_lexer_context_push(ls); parse_name(ls, buf); nm = eina_strbuf_string_get(buf); - bnm = get_filename(ls); + bnm = eina_stringshare_ref(ls->filename); fnm = database_class_to_filename(nm); if (!compare_class_file(bnm, fnm)) { @@ -744,6 +737,7 @@ parse_ptr: Eolian_Type *pdef; pop_type(ls); pdef = push_type(ls); + pdef->base.file = eina_stringshare_ref(ls->filename); pdef->base.line = ls->line_number; pdef->base.column = ls->column; pdef->base_type = def; @@ -777,8 +771,6 @@ static Eolian_Type * parse_typedef(Eo_Lexer *ls) { Eolian_Type *def = push_type(ls); - def->base.line = ls->line_number; - def->base.column = ls->column; Eina_Bool is_extern = EINA_FALSE; Eina_Strbuf *buf; eo_lexer_get(ls); @@ -791,6 +783,7 @@ parse_typedef(Eo_Lexer *ls) def->is_extern = is_extern; buf = push_strbuf(ls); eo_lexer_context_push(ls); + def->base.file = eina_stringshare_ref(ls->filename); def->base.line = ls->line_number; def->base.column = ls->column; parse_name(ls, buf); @@ -802,7 +795,6 @@ parse_typedef(Eo_Lexer *ls) redef_error(ls, EOLIAN_TYPE_ALIAS, tp); } eo_lexer_context_pop(ls); - def->file = get_filename(ls); (void)!!test_next(ls, ':'); def->base_type = parse_type_struct(ls, EINA_TRUE); pop_type(ls); @@ -853,6 +845,7 @@ static void parse_param(Eo_Lexer *ls, Eina_Bool allow_inout) { Eo_Param_Def *par = calloc(1, sizeof(Eo_Param_Def)); + par->base.file = eina_stringshare_ref(ls->filename); par->base.line = ls->line_number; par->base.column = ls->column; ls->tmp.param = par; @@ -942,6 +935,7 @@ parse_accessor(Eo_Lexer *ls) Eo_Accessor_Def *acc = NULL; Eina_Bool has_return = EINA_FALSE, has_legacy = EINA_FALSE; acc = calloc(1, sizeof(Eo_Accessor_Def)); + acc->base.file = eina_stringshare_ref(ls->filename); acc->base.line = ls->line_number; acc->base.column = ls->column; ls->tmp.accessor = acc; @@ -1014,6 +1008,7 @@ parse_property(Eo_Lexer *ls) has_protected = EINA_FALSE, has_class = EINA_FALSE, has_constructor = EINA_FALSE; prop = calloc(1, sizeof(Eo_Property_Def)); + prop->base.file = eina_stringshare_ref(ls->filename); prop->base.line = ls->line_number; prop->base.column = ls->column; ls->tmp.prop = prop; @@ -1094,6 +1089,7 @@ parse_method(Eo_Lexer *ls, Eina_Bool ctor) has_protected = EINA_FALSE, has_class = EINA_FALSE, has_constructor = EINA_FALSE; meth = calloc(1, sizeof(Eo_Method_Def)); + meth->base.file = eina_stringshare_ref(ls->filename); meth->base.line = ls->line_number; meth->base.column = ls->column; ls->tmp.meth = meth; @@ -1187,6 +1183,7 @@ parse_implement(Eo_Lexer *ls, Eina_Bool iface) Eolian_Implement *impl = NULL; buf = push_strbuf(ls); impl = calloc(1, sizeof(Eolian_Implement)); + impl->base.file = eina_stringshare_ref(ls->filename); impl->base.line = ls->line_number; impl->base.column = ls->column; ls->tmp.impl = impl; @@ -1279,6 +1276,7 @@ static void parse_event(Eo_Lexer *ls) { Eolian_Event *ev = calloc(1, sizeof(Eolian_Event)); + ev->base.file = eina_stringshare_ref(ls->filename); ev->base.line = ls->line_number; ev->base.column = ls->column; Eina_Strbuf *buf = push_strbuf(ls); @@ -1470,13 +1468,14 @@ parse_class(Eo_Lexer *ls, Eina_Bool allow_ctors, Eolian_Class_Type type) int line, col; Eina_Strbuf *buf = push_strbuf(ls); ls->tmp.kls = calloc(1, sizeof(Eo_Class_Def)); + ls->tmp.kls->base.file = eina_stringshare_ref(ls->filename); ls->tmp.kls->base.line = ls->line_number; ls->tmp.kls->base.column = ls->column; eo_lexer_get(ls); ls->tmp.kls->type = type; eo_lexer_context_push(ls); parse_name(ls, buf); - bnm = get_filename(ls); + bnm = eina_stringshare_ref(ls->filename); fnm = database_class_to_filename(eina_strbuf_string_get(buf)); same = compare_class_file(bnm, fnm); eina_stringshare_del(bnm); @@ -1489,7 +1488,6 @@ parse_class(Eo_Lexer *ls, Eina_Bool allow_ctors, Eolian_Class_Type type) eo_lexer_context_pop(ls); ls->tmp.kls->name = eina_stringshare_add(eina_strbuf_string_get(buf)); pop_strbuf(ls); - ls->tmp.kls->file = get_filename(ls); if (ls->t.token != '{') { line = ls->line_number; diff --git a/src/lib/eolian/eolian_database.c b/src/lib/eolian/eolian_database.c index 5b9ba974fd..3873206a26 100644 --- a/src/lib/eolian/eolian_database.c +++ b/src/lib/eolian/eolian_database.c @@ -6,9 +6,13 @@ Eina_Hash *_classes = NULL; Eina_Hash *_aliases = NULL; Eina_Hash *_structs = NULL; +Eina_Hash *_globals = NULL; +Eina_Hash *_constants = NULL; Eina_Hash *_classesf = NULL; Eina_Hash *_aliasesf = NULL; Eina_Hash *_structsf = NULL; +Eina_Hash *_globalsf = NULL; +Eina_Hash *_constantsf = NULL; Eina_Hash *_filenames = NULL; Eina_Hash *_tfilenames = NULL; @@ -28,9 +32,13 @@ database_init() _classes = eina_hash_stringshared_new(EINA_FREE_CB(database_class_del)); _aliases = eina_hash_stringshared_new(EINA_FREE_CB(database_typedef_del)); _structs = eina_hash_stringshared_new(EINA_FREE_CB(database_type_del)); + _globals = eina_hash_stringshared_new(EINA_FREE_CB(database_var_del)); + _constants = eina_hash_stringshared_new(EINA_FREE_CB(database_var_del)); _classesf = eina_hash_stringshared_new(NULL); _aliasesf = eina_hash_stringshared_new(_hashlist_free); _structsf = eina_hash_stringshared_new(_hashlist_free); + _globalsf = eina_hash_stringshared_new(_hashlist_free); + _constantsf = eina_hash_stringshared_new(_hashlist_free); _filenames = eina_hash_string_small_new(free); _tfilenames = eina_hash_string_small_new(free); return ++_database_init_count; @@ -51,9 +59,13 @@ database_shutdown() eina_hash_free(_classes); eina_hash_free(_aliases); eina_hash_free(_structs); + eina_hash_free(_globals); + eina_hash_free(_constants); eina_hash_free(_classesf); eina_hash_free(_aliasesf); eina_hash_free(_structsf); + eina_hash_free(_globalsf); + eina_hash_free(_constantsf); eina_hash_free(_filenames); eina_hash_free(_tfilenames); eina_shutdown(); diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h index e4e5e0bc48..29b88545bb 100644 --- a/src/lib/eolian/eolian_database.h +++ b/src/lib/eolian/eolian_database.h @@ -38,9 +38,13 @@ extern Eina_Prefix *_eolian_prefix; extern Eina_Hash *_classes; extern Eina_Hash *_aliases; extern Eina_Hash *_structs; +extern Eina_Hash *_globals; +extern Eina_Hash *_constants; extern Eina_Hash *_classesf; extern Eina_Hash *_aliasesf; extern Eina_Hash *_structsf; +extern Eina_Hash *_globalsf; +extern Eina_Hash *_constantsf; extern Eina_Hash *_filenames; /* Hash: filename without extension -> full path */ extern Eina_Hash *_tfilenames; @@ -57,7 +61,6 @@ struct _Eolian_Class Eina_Stringshare *full_name; Eina_List *namespaces; /* List Eina_Stringshare * */ Eina_Stringshare *name; - Eina_Stringshare *file; Eolian_Class_Type type; Eina_Stringshare *description; Eina_Stringshare *legacy_prefix; @@ -126,7 +129,6 @@ struct _Eolian_Type Eina_List *namespaces; Eina_Hash *fields; Eina_Stringshare *comment; - Eina_Stringshare *file; }; }; Eina_Bool is_const :1; @@ -230,6 +232,18 @@ struct _Eolian_Expression }; }; +struct _Eolian_Variable +{ + Eolian_Object base; + Eolian_Variable_Type type; + Eina_Stringshare *name; + Eina_Stringshare *full_name; + Eina_List *namespaces; + Eolian_Type *base_type; + Eolian_Expression *value; + Eina_Stringshare *comment; +}; + int database_init(); int database_shutdown(); @@ -248,6 +262,12 @@ void database_type_to_str(const Eolian_Type *tp, Eina_Strbuf *buf, const char *n Eolian_Expression_Type database_expr_eval(const Eolian_Expression *expr, Eolian_Expression_Mask mask, Eina_Value **out); void database_expr_del(Eolian_Expression *expr); +/* variables */ + +void database_var_del(Eolian_Variable *var); +Eina_Bool database_var_global_add(Eolian_Variable *var); +Eina_Bool database_var_constant_add(Eolian_Variable *var); + /* classes */ Eolian_Class *database_class_add(const char *class_name, Eolian_Class_Type type); @@ -264,7 +284,6 @@ void database_class_description_set(Eolian_Class *cl, const char *description); void database_class_legacy_prefix_set(Eolian_Class *cl, const char *legacy_prefix); void database_class_eo_prefix_set(Eolian_Class *cl, const char *eo_prefix); void database_class_data_type_set(Eolian_Class *cl, const char *data_type); -void database_class_file_set(Eolian_Class *cl, const char *file_name); Eina_Bool database_class_ctor_enable_set(Eolian_Class *cl, Eina_Bool enable); Eina_Bool database_class_dtor_enable_set(Eolian_Class *cl, Eina_Bool enable);