summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Kolesa <d.kolesa@samsung.com>2014-08-08 15:19:52 +0100
committerDaniel Kolesa <d.kolesa@samsung.com>2014-08-21 09:26:04 +0100
commit70bf1eac24590646d0fd2d594bf38e07e5258b19 (patch)
tree9a69d342cf0ad6ea6e1aceb532b10e71caaf46f4
parenta57c729b1032ee305dccf40b33d0054a84ced155 (diff)
downloadefl-70bf1eac24590646d0fd2d594bf38e07e5258b19.tar.gz
eolian: add infrastructure for globals and constants
Nothing parses yet, and no API is exposed. Also, move the remaining instances of file inside of existing structures to Eolian_Object and parse basename only once.
-rw-r--r--src/Makefile_Eolian.am4
-rw-r--r--src/lib/eolian/Eolian.h13
-rw-r--r--src/lib/eolian/database_class.c9
-rw-r--r--src/lib/eolian/database_class_api.c2
-rw-r--r--src/lib/eolian/database_fill.c2
-rw-r--r--src/lib/eolian/database_type.c9
-rw-r--r--src/lib/eolian/database_type_api.c2
-rw-r--r--src/lib/eolian/database_var.c39
-rw-r--r--src/lib/eolian/database_var_api.c95
-rw-r--r--src/lib/eolian/eo_definitions.c2
-rw-r--r--src/lib/eolian/eo_lexer.c19
-rw-r--r--src/lib/eolian/eo_lexer.h2
-rw-r--r--src/lib/eolian/eo_parser.c54
-rw-r--r--src/lib/eolian/eolian_database.c12
-rw-r--r--src/lib/eolian/eolian_database.h25
15 files changed, 235 insertions, 54 deletions
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 <Eina.h>
+#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 <Eina.h>
+#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 <setjmp.h>
#include <assert.h>
+#include <libgen.h>
#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 <libgen.h>
-
#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);