From 9aaa5cf83915007ed43acabeb8ab3171b8ec23d1 Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Thu, 14 Dec 2017 17:18:32 +0100 Subject: [PATCH] eolian: remove _cunit and prepare for returning actual units --- src/lib/eolian/eo_lexer.c | 11 +++--- src/lib/eolian/eo_parser.c | 36 ++++++++++++------ src/lib/eolian/eo_parser.h | 2 +- src/lib/eolian/eolian_database.c | 63 +++++++++++++++----------------- src/lib/eolian/eolian_database.h | 2 +- 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 */