From 7cfde40500b24e1a7ed0ac4c2525fdd0ebe81e56 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Sat, 22 Mar 2014 00:51:05 -0400 Subject: [PATCH] edje_cc no longer fails when program.name is specified after program.after --- src/bin/edje/edje_cc.h | 3 ++- src/bin/edje/edje_cc_handlers.c | 20 +++++++++++++++++++- src/bin/edje/edje_cc_out.c | 14 ++++++++++++-- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/bin/edje/edje_cc.h b/src/bin/edje/edje_cc.h index 87fcb07e3f..6f43260f49 100644 --- a/src/bin/edje/edje_cc.h +++ b/src/bin/edje/edje_cc.h @@ -155,7 +155,8 @@ void data_queue_part_lookup(Edje_Part_Collection *pc, const char *name, int * void data_queue_part_reallocated_lookup(Edje_Part_Collection *pc, const char *name, unsigned char **base, int offset); void data_queue_copied_part_lookup(Edje_Part_Collection *pc, int *src, int *dest); -void data_queue_program_lookup(Edje_Part_Collection *pc, const char *name, int *dest); +void *data_queue_program_lookup(Edje_Part_Collection *pc, const char *name, int *dest); +void program_lookup_rename(void *p, const char *name); void data_queue_copied_program_lookup(Edje_Part_Collection *pc, int *src, int *dest); void data_queue_anonymous_lookup(Edje_Part_Collection *pc, Edje_Program *ep, int *dest); void data_queue_copied_anonymous_lookup(Edje_Part_Collection *pc, int *src, int *dest); diff --git a/src/bin/edje/edje_cc_handlers.c b/src/bin/edje/edje_cc_handlers.c index f38273baf0..eb7b0f9fb8 100644 --- a/src/bin/edje/edje_cc_handlers.c +++ b/src/bin/edje/edje_cc_handlers.c @@ -138,8 +138,10 @@ static Edje_Pack_Element *current_item = NULL; static Edje_Part_Description_Common *current_desc = NULL; static Edje_Part_Description_Common *parent_desc = NULL; static Edje_Program *current_program = NULL; +static Eina_List *current_program_lookups = NULL; static Eina_Bool current_group_inherit = EINA_FALSE; static Edje_Program *sequencing = NULL; +static Eina_List *sequencing_lookups = NULL; struct _Edje_Cc_Handlers_Hierarchy_Info { /* Struct that keeps globals value to impl hierarchy */ @@ -9036,6 +9038,7 @@ _program_after(const char *name) Edje_Program_After *pa2; Eina_List *l; char *copy; + void *pl; pc = eina_list_data_get(eina_list_last(edje_collections)); ep = current_program; @@ -9051,7 +9054,9 @@ _program_after(const char *name) ep->after = eina_list_append(ep->after, pa); copy = (char*)(pa + 1); memcpy(copy, name, strlen(name) + 1); - data_queue_program_lookup(pc, name, &(pa->id)); + pl = data_queue_program_lookup(pc, name, &(pa->id)); + if (pl) + current_program_lookups = eina_list_append(current_program_lookups, pl); } static Edje_Program * @@ -9109,6 +9114,8 @@ ob_collections_group_programs_program(void) Edje_Program_Parser *epp; char *def_name; + current_program_lookups = eina_list_free(current_program_lookups); + pc = eina_list_data_get(eina_list_last(edje_collections)); ep = mem_alloc(SZ(Edje_Program_Parser)); @@ -9141,6 +9148,8 @@ static void st_collections_group_programs_program_name(void) { Edje_Part_Collection *pc; + Eina_List *l; + void *pl; check_arg_count(1); @@ -9153,6 +9162,10 @@ st_collections_group_programs_program_name(void) _edje_program_check(current_program->name, current_program, pc->programs.strncmp, pc->programs.strncmp_count); _edje_program_check(current_program->name, current_program, pc->programs.strrncmp, pc->programs.strrncmp_count); _edje_program_check(current_program->name, current_program, pc->programs.nocmp, pc->programs.nocmp_count); + + + EINA_LIST_FOREACH(current_program_lookups, l, pl) + program_lookup_rename(pl, current_program->name); } /** @@ -9846,6 +9859,8 @@ static void ob_collections_group_programs_program_sequence(void) { sequencing = current_program; + sequencing_lookups = current_program_lookups; + current_program_lookups = NULL; ((Edje_Program_Parser*)sequencing)->can_override = EINA_FALSE; } @@ -10093,6 +10108,9 @@ edje_cc_handlers_pop_notify(const char *token) if ((!sequencing) || strcmp(token, "sequence")) return; current_program = sequencing; ((Edje_Program_Parser*)sequencing)->can_override = EINA_TRUE; + current_program_lookups = eina_list_free(current_program_lookups); + current_program_lookups = sequencing_lookups; + sequencing_lookups = NULL; sequencing = NULL; } diff --git a/src/bin/edje/edje_cc_out.c b/src/bin/edje/edje_cc_out.c index 5f54513030..05d3e4f915 100644 --- a/src/bin/edje/edje_cc_out.c +++ b/src/bin/edje/edje_cc_out.c @@ -2351,12 +2351,12 @@ data_queue_copied_anonymous_lookup(Edje_Part_Collection *pc, int *src, int *dest } } -void +void * data_queue_program_lookup(Edje_Part_Collection *pc, const char *name, int *dest) { Program_Lookup *pl; - if (!name) return; /* FIXME: should we stop compiling ? */ + if (!name) return NULL; /* FIXME: should we stop compiling ? */ pl = mem_alloc(SZ(Program_Lookup)); program_lookups = eina_list_append(program_lookups, pl); @@ -2364,6 +2364,16 @@ data_queue_program_lookup(Edje_Part_Collection *pc, const char *name, int *dest) pl->u.name = mem_strdup(name); pl->dest = dest; pl->anonymous = EINA_FALSE; + return pl; +} + +void +program_lookup_rename(void *p, const char *name) +{ + Program_Lookup *pl = p; + + free(pl->u.name); + pl->u.name = strdup(name); } void