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.
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\"
*/
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"
| 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.
*
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);
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
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 *
const char *s;
Eina_List *l;
- database_class_file_set(cl, kls->file);
+ eina_hash_set(_classesf, kls->base.file, cl);
if (kls->comment)
{
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);
}
{
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;
}
{
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;
}
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 *
--- /dev/null
+#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;
+}
--- /dev/null
+#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);
+}
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)
#include <setjmp.h>
#include <assert.h>
+#include <libgen.h>
#include "eo_lexer.h"
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)
{
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);
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);
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;
-#include <libgen.h>
-
#include "eo_parser.h"
#define CASE_LOCK(ls, var, msg) \
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)
{
{
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)",
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;
{
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 */
{
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;
{
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;
break;
}
}
- expr->base.file = get_filename(ls);
+ expr->base.file = eina_stringshare_ref(ls->filename);
expr->base.line = line;
expr->base.column = col;
break;
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;
{
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);
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));
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;
}
}
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);
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;
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;
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)
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))
{
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;
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);
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);
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);
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;
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;
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;
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;
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;
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);
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);
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;
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;
_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;
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();
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;
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;
Eina_List *namespaces;
Eina_Hash *fields;
Eina_Stringshare *comment;
- Eina_Stringshare *file;
};
};
Eina_Bool is_const :1;
};
};
+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();
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);
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);