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.
This commit is contained in:
Daniel Kolesa 2014-08-08 15:19:52 +01:00
parent a57c729b10
commit 70bf1eac24
15 changed files with 235 additions and 54 deletions

View File

@ -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\"

View File

@ -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.
*

View File

@ -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

View File

@ -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 *

View File

@ -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)
{

View File

@ -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;
}

View File

@ -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 *

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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)

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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();

View File

@ -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);