summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Kolesa <d.kolesa@osg.samsung.com>2017-12-14 17:18:32 +0100
committerDaniel Kolesa <d.kolesa@osg.samsung.com>2017-12-14 17:31:21 +0100
commit9aaa5cf83915007ed43acabeb8ab3171b8ec23d1 (patch)
tree6b64772d982d6888f117fbf2f452f11caedc76b9
parent2259b6f16fc3f7cd186cc4966fb53efc12761938 (diff)
downloadefl-9aaa5cf83915007ed43acabeb8ab3171b8ec23d1.tar.gz
eolian: remove _cunit and prepare for returning actual units
-rw-r--r--src/lib/eolian/eo_lexer.c11
-rw-r--r--src/lib/eolian/eo_parser.c36
-rw-r--r--src/lib/eolian/eo_parser.h2
-rw-r--r--src/lib/eolian/eolian_database.c63
-rw-r--r--src/lib/eolian/eolian_database.h2
5 files changed, 61 insertions, 53 deletions
diff --git a/src/lib/eolian/eo_lexer.c b/src/lib/eolian/eo_lexer.c
index afe7cc8a4c..80f08eac2c 100644
--- a/src/lib/eolian/eo_lexer.c
+++ b/src/lib/eolian/eo_lexer.c
@@ -1035,6 +1035,12 @@ eo_lexer_set_input(Eo_Lexer *ls, Eolian *state, const char *source)
ls->icolumn = ls->column = -1;
ls->decpoint = '.';
next_char(ls);
+
+ Eolian_Unit *ncunit = calloc(1, sizeof(Eolian_Unit));
+ ls->unit = ncunit;
+ database_unit_init(state, ncunit);
+ eina_hash_add(state->units, ls->filename, ncunit);
+
if (ls->current != 0xEF)
return;
next_char(ls);
@@ -1044,11 +1050,6 @@ eo_lexer_set_input(Eo_Lexer *ls, Eolian *state, const char *source)
if (ls->current != 0xBF)
return;
next_char(ls);
-
- Eolian_Unit *ncunit = calloc(1, sizeof(Eolian_Unit));
- ls->unit = ncunit;
- database_unit_init(state, ncunit, ls->filename);
- eina_hash_add(state->units, ls->filename, ncunit);
}
static void
diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c
index e8cecef038..71e1d7ee55 100644
--- a/src/lib/eolian/eo_parser.c
+++ b/src/lib/eolian/eo_parser.c
@@ -683,7 +683,7 @@ _parse_dep(Eo_Lexer *ls, const char *fname, const char *name)
if (eina_hash_find(ls->state->parsing, fname))
return NULL;
Eolian_Class *cl = NULL;
- if (!eo_parser_database_fill(ls->state, fname, EINA_FALSE, &cl) || !cl)
+ if (!eo_parser_database_fill(ls->unit, fname, EINA_FALSE, &cl) || !cl)
{
char buf[PATH_MAX];
eo_lexer_context_restore(ls);
@@ -2496,19 +2496,30 @@ end:
return ret;
}
-Eina_Bool
-eo_parser_database_fill(Eolian *state, const char *filename, Eina_Bool eot, Eolian_Class **fcl)
+Eolian_Unit *
+eo_parser_database_fill(Eolian_Unit *parent, const char *filename, Eina_Bool eot, Eolian_Class **fcl)
{
- Eolian_Class *cl = eina_hash_find(state->parsed, filename);
+ Eolian_Class *cl = eina_hash_find(parent->state->parsed, filename);
if (cl)
{
if (!eot && fcl) *fcl = cl;
- return EINA_TRUE;
+ const char *fsl = strrchr(filename, '/');
+ const char *bsl = strrchr(filename, '\\');
+ const char *fname = NULL;
+ if (fsl || bsl)
+ fname = eina_stringshare_add((fsl > bsl) ? (fsl + 1) : (bsl + 1));
+ if (fname)
+ {
+ Eolian_Unit *ret = eina_hash_find(parent->state->units, fname);
+ eina_stringshare_del(fname);
+ return ret;
+ }
+ return NULL;
}
- eina_hash_set(state->parsing, filename, (void *)EINA_TRUE);
+ eina_hash_set(parent->state->parsing, filename, (void *)EINA_TRUE);
- Eo_Lexer *ls = eo_lexer_new(state, filename);
+ Eo_Lexer *ls = eo_lexer_new(parent->state, filename);
if (!ls)
{
_eolian_log("unable to create lexer for file '%s'", filename);
@@ -2544,14 +2555,15 @@ eo_parser_database_fill(Eolian *state, const char *filename, Eina_Bool eot, Eoli
if (fcl) *fcl = cl;
done:
- eina_hash_set(state->parsed, filename, eot ? (void *)EINA_TRUE : cl);
- eina_hash_set(state->parsing, filename, (void *)EINA_FALSE);
+ eina_hash_set(ls->state->parsed, filename, eot ? (void *)EINA_TRUE : cl);
+ eina_hash_set(ls->state->parsing, filename, (void *)EINA_FALSE);
+ eina_hash_add(parent->children, filename, ls->unit);
eo_lexer_free(ls);
- return EINA_TRUE;
+ return ls->unit;
error:
- eina_hash_set(state->parsing, filename, (void *)EINA_FALSE);
+ eina_hash_set(ls->state->parsing, filename, (void *)EINA_FALSE);
eo_lexer_free(ls);
- return EINA_FALSE;
+ return NULL;
}
diff --git a/src/lib/eolian/eo_parser.h b/src/lib/eolian/eo_parser.h
index 8196c5bf9d..f7422e4704 100644
--- a/src/lib/eolian/eo_parser.h
+++ b/src/lib/eolian/eo_parser.h
@@ -3,6 +3,6 @@
#include "eo_lexer.h"
-Eina_Bool eo_parser_database_fill(Eolian *state, const char *filename, Eina_Bool eot, Eolian_Class **cl);
+Eolian_Unit *eo_parser_database_fill(Eolian_Unit *parent, const char *filename, Eina_Bool eot, Eolian_Class **cl);
#endif /* __EO_PARSER_H__ */ \ No newline at end of file
diff --git a/src/lib/eolian/eolian_database.c b/src/lib/eolian/eolian_database.c
index 360d979d77..bf1cd50c10 100644
--- a/src/lib/eolian/eolian_database.c
+++ b/src/lib/eolian/eolian_database.c
@@ -11,8 +11,6 @@
Eina_Hash *_decls = NULL;
Eina_Hash *_declsf = NULL;
-static Eolian_Unit *_cunit = NULL;
-
static int _database_init_count = 0;
static void
@@ -542,17 +540,10 @@ eolian_doc_token_ref_get(const Eolian_Unit *unit, const Eolian_Doc_Token *tok,
}
void
-database_unit_init(Eolian *state, Eolian_Unit *unit, Eina_Stringshare *fname)
+database_unit_init(Eolian *state, Eolian_Unit *unit)
{
unit->state = state;
- if (fname)
- {
- Eolian_Unit *ocunit = _cunit;
- if (ocunit)
- eina_hash_add(ocunit->children, fname, unit);
- }
-
unit->children = eina_hash_stringshared_new(NULL);
unit->classes = eina_hash_stringshared_new(EINA_FREE_CB(database_class_del));
unit->globals = eina_hash_stringshared_new(EINA_FREE_CB(database_var_del));
@@ -560,9 +551,6 @@ database_unit_init(Eolian *state, Eolian_Unit *unit, Eina_Stringshare *fname)
unit->aliases = eina_hash_stringshared_new(EINA_FREE_CB(database_typedecl_del));
unit->structs = eina_hash_stringshared_new(EINA_FREE_CB(database_typedecl_del));
unit->enums = eina_hash_stringshared_new(EINA_FREE_CB(database_typedecl_del));
-
- if (fname)
- _cunit = unit;
}
void
@@ -586,7 +574,7 @@ eolian_new(void)
if (!state)
return NULL;
- database_unit_init(state, &state->unit, NULL);
+ database_unit_init(state, &state->unit);
state->filenames_eo = eina_hash_string_small_new(free);
state->filenames_eot = eina_hash_string_small_new(free);
@@ -699,61 +687,62 @@ database_class_to_filename(const char *cname)
return ret;
}
-static Eina_Bool
-_eolian_file_parse_nodep(Eolian *state, const char *filepath)
+static Eolian_Unit *
+_eolian_file_parse_nodep(Eolian_Unit *parent, const char *filepath)
{
Eina_Bool is_eo;
const char *eopath;
if (_database_init_count <= 0)
- return EINA_FALSE;
+ return NULL;
is_eo = eina_str_has_suffix(filepath, EO_SUFFIX);
if (!is_eo && !eina_str_has_suffix(filepath, EOT_SUFFIX))
{
_eolian_log("file '%s' doesn't have a correct extension", filepath);
- return EINA_FALSE;
+ return NULL;
}
- if (!(eopath = eina_hash_find(is_eo ? state->filenames_eo : state->filenames_eot, filepath)))
+ if (!(eopath = eina_hash_find(is_eo ? parent->state->filenames_eo : parent->state->filenames_eot, filepath)))
{
char *vpath = eina_file_path_sanitize(filepath);
- Eina_Bool ret = eo_parser_database_fill(state, vpath, !is_eo, NULL);
+ Eolian_Unit *ret = eo_parser_database_fill(parent, vpath, !is_eo, NULL);
free(vpath);
return ret;
}
- return eo_parser_database_fill(state, eopath, !is_eo, NULL);
+ return eo_parser_database_fill(parent, eopath, !is_eo, NULL);
}
static Eina_Bool
-_parse_deferred(Eolian *state)
+_parse_deferred(Eolian_Unit *parent)
{
- Eina_Hash *defer = state->defer;
+ Eina_Hash *defer = parent->state->defer;
if (!defer || !eina_hash_population(defer))
return EINA_TRUE;
/* clean room for more deps for later parsing */
- state->defer = eina_hash_string_small_new(NULL);
+ parent->state->defer = eina_hash_string_small_new(NULL);
Eina_Iterator *itr = eina_hash_iterator_data_new(defer);
const char *dep;
EINA_ITERATOR_FOREACH(itr, dep)
{
- if (!_eolian_file_parse_nodep(state, dep))
+ Eolian_Unit *pdep = _eolian_file_parse_nodep(parent, dep);
+ if (!pdep || !_parse_deferred(pdep))
{
eina_iterator_free(itr);
- eina_hash_free_buckets(state->defer);
+ eina_hash_free_buckets(parent->state->defer);
eina_hash_free(defer);
return EINA_FALSE;
}
}
eina_iterator_free(itr);
eina_hash_free(defer);
- /* in case more deps were queued in, parse them */
- return _parse_deferred(state);
+ return EINA_TRUE;
}
EAPI const Eolian_Unit *
eolian_file_parse(Eolian *state, const char *filepath)
{
- if (!_eolian_file_parse_nodep(state, filepath))
+ Eolian_Unit *ret = _eolian_file_parse_nodep((Eolian_Unit *)state, filepath);
+ if (!ret)
return NULL;
- if (!_parse_deferred(state))
+ if (!_parse_deferred(ret))
return NULL;
/* FIXME: pass unit properly */
if (!database_validate(state, &state->unit))
@@ -770,8 +759,11 @@ typedef struct _Parse_Data
static Eina_Bool _tfile_parse(const Eina_Hash *hash EINA_UNUSED, const void *key EINA_UNUSED, void *data, void *fdata)
{
Parse_Data *pd = fdata;
- if (pd->ret) pd->ret = eo_parser_database_fill(pd->state, data, EINA_TRUE, NULL);
- if (pd->ret) pd->ret = _parse_deferred(pd->state);
+ Eolian_Unit *unit = NULL;
+ if (pd->ret)
+ unit = eo_parser_database_fill((Eolian_Unit *)pd->state, data, EINA_TRUE, NULL);
+ pd->ret = !!unit;
+ if (pd->ret) pd->ret = _parse_deferred(unit);
return pd->ret;
}
@@ -795,8 +787,11 @@ eolian_all_eot_files_parse(Eolian *state)
static Eina_Bool _file_parse(const Eina_Hash *hash EINA_UNUSED, const void *key EINA_UNUSED, void *data, void *fdata)
{
Parse_Data *pd = fdata;
- if (pd->ret) pd->ret = eo_parser_database_fill(pd->state, data, EINA_FALSE, NULL);
- if (pd->ret) pd->ret = _parse_deferred(pd->state);
+ Eolian_Unit *unit = NULL;
+ if (pd->ret)
+ unit = eo_parser_database_fill((Eolian_Unit *)pd->state, data, EINA_FALSE, NULL);
+ pd->ret = !!unit;
+ if (pd->ret) pd->ret = _parse_deferred(unit);
return pd->ret;
}
diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h
index 6b4a06b0f7..b2e72907ab 100644
--- a/src/lib/eolian/eolian_database.h
+++ b/src/lib/eolian/eolian_database.h
@@ -327,7 +327,7 @@ void database_decl_add(Eina_Stringshare *name, Eolian_Declaration_Type type,
void database_doc_del(Eolian_Documentation *doc);
-void database_unit_init(Eolian *state, Eolian_Unit *unit, Eina_Stringshare *fname);
+void database_unit_init(Eolian *state, Eolian_Unit *unit);
void database_unit_del(Eolian_Unit *unit);
/* types */