eolian: disallow duplicate entries in requires/composite sections

This commit is contained in:
Daniel Kolesa 2019-09-06 16:58:08 +02:00
parent d1c5e201be
commit 67c2a4f5f1
1 changed files with 34 additions and 6 deletions

View File

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