forked from enlightenment/efl
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:
parent
a57c729b10
commit
70bf1eac24
|
@ -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\"
|
||||
|
|
|
@ -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.
|
||||
*
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 *
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 *
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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);
|
||||
}
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue