eolian: disallow duplicate entries in requires/composite sections
This commit is contained in:
parent
d1c5e201be
commit
67c2a4f5f1
|
@ -2157,14 +2157,28 @@ _requires_add(Eo_Lexer *ls, Eina_Strbuf *buf)
|
||||||
{
|
{
|
||||||
const char *required;
|
const char *required;
|
||||||
char *fnm;
|
char *fnm;
|
||||||
|
Eina_List *l;
|
||||||
|
const char *oname;
|
||||||
|
char ebuf[PATH_MAX];
|
||||||
|
|
||||||
eina_strbuf_reset(buf);
|
eina_strbuf_reset(buf);
|
||||||
eo_lexer_context_push(ls);
|
eo_lexer_context_push(ls);
|
||||||
parse_name(ls, buf);
|
parse_name(ls, buf);
|
||||||
required = eina_strbuf_string_get(buf);
|
required = eina_stringshare_add(eina_strbuf_string_get(buf));
|
||||||
|
|
||||||
|
EINA_LIST_FOREACH(ls->klass->requires, l, oname)
|
||||||
|
if (required == oname)
|
||||||
|
{
|
||||||
|
eo_lexer_context_restore(ls);
|
||||||
|
eina_stringshare_del(required);
|
||||||
|
snprintf(ebuf, sizeof(ebuf), "duplicate entry '%s'", oname);
|
||||||
|
eo_lexer_syntax_error(ls, ebuf);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
fnm = database_class_to_filename(required);
|
fnm = database_class_to_filename(required);
|
||||||
|
|
||||||
ls->klass->requires = eina_list_append(ls->klass->requires, eina_stringshare_add(required));
|
ls->klass->requires = eina_list_append(ls->klass->requires, required);
|
||||||
database_defer(ls->state, fnm, EINA_TRUE);
|
database_defer(ls->state, fnm, EINA_TRUE);
|
||||||
eo_lexer_context_pop(ls);
|
eo_lexer_context_pop(ls);
|
||||||
|
|
||||||
|
@ -2174,25 +2188,39 @@ _requires_add(Eo_Lexer *ls, Eina_Strbuf *buf)
|
||||||
static void
|
static void
|
||||||
_composite_add(Eo_Lexer *ls, Eina_Strbuf *buf)
|
_composite_add(Eo_Lexer *ls, Eina_Strbuf *buf)
|
||||||
{
|
{
|
||||||
|
const char *oname;
|
||||||
|
char ebuf[PATH_MAX];
|
||||||
|
Eina_List *l;
|
||||||
|
|
||||||
eina_strbuf_reset(buf);
|
eina_strbuf_reset(buf);
|
||||||
eo_lexer_context_push(ls);
|
eo_lexer_context_push(ls);
|
||||||
parse_name(ls, buf);
|
parse_name(ls, buf);
|
||||||
const char *nm = eina_strbuf_string_get(buf);
|
const char *nm = eina_stringshare_add(eina_strbuf_string_get(buf));
|
||||||
|
|
||||||
|
EINA_LIST_FOREACH(ls->klass->composite, l, oname)
|
||||||
|
if (nm == oname)
|
||||||
|
{
|
||||||
|
eo_lexer_context_restore(ls);
|
||||||
|
snprintf(ebuf, sizeof(ebuf), "duplicate entry '%s'", nm);
|
||||||
|
eina_stringshare_del(nm);
|
||||||
|
eo_lexer_syntax_error(ls, ebuf);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
char *fnm = database_class_to_filename(nm);
|
char *fnm = database_class_to_filename(nm);
|
||||||
if (!eina_hash_find(ls->state->filenames_eo, fnm))
|
if (!eina_hash_find(ls->state->filenames_eo, fnm))
|
||||||
{
|
{
|
||||||
free(fnm);
|
free(fnm);
|
||||||
char ebuf[PATH_MAX];
|
|
||||||
eo_lexer_context_restore(ls);
|
eo_lexer_context_restore(ls);
|
||||||
snprintf(ebuf, sizeof(ebuf), "unknown interface '%s'", nm);
|
snprintf(ebuf, sizeof(ebuf), "unknown interface '%s'", nm);
|
||||||
|
eina_stringshare_del(nm);
|
||||||
eo_lexer_syntax_error(ls, ebuf);
|
eo_lexer_syntax_error(ls, ebuf);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* do not introduce a dependency */
|
/* do not introduce a dependency */
|
||||||
database_defer(ls->state, fnm, EINA_FALSE);
|
database_defer(ls->state, fnm, EINA_FALSE);
|
||||||
free(fnm);
|
free(fnm);
|
||||||
ls->klass->composite = eina_list_append(ls->klass->composite,
|
ls->klass->composite = eina_list_append(ls->klass->composite, nm);
|
||||||
eina_stringshare_add(nm));
|
|
||||||
eo_lexer_context_pop(ls);
|
eo_lexer_context_pop(ls);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue