formatting fix + list walk optimisation.

SVN revision: 51874
This commit is contained in:
Carsten Haitzler 2010-09-04 03:53:12 +00:00
parent 2c397940de
commit 2d34d6d2a3
3 changed files with 150 additions and 129 deletions

View File

@ -37,7 +37,7 @@ static int
_edje_match_states_alloc(Edje_Patterns *ppat, int n) _edje_match_states_alloc(Edje_Patterns *ppat, int n)
{ {
Edje_States *l; Edje_States *l;
const size_t patterns_size = ppat->patterns_size; const size_t patterns_size = ppat->patterns_size;
const size_t patterns_max_length = ppat->max_length; const size_t patterns_max_length = ppat->max_length;
@ -95,7 +95,7 @@ _edje_match_states_insert(Edje_States *list,
size_t pos) size_t pos)
{ {
size_t i; size_t i;
i = (idx * (patterns_max_length + 1)) + pos; i = (idx * (patterns_max_length + 1)) + pos;
if (i < list->size) if (i < list->size)
@ -133,41 +133,41 @@ _edje_match_patterns_exec_class_token(enum status *status,
const char *cl_tok, const char *cl_tok,
char c) char c)
{ {
if (! *cl_tok) if (! *cl_tok)
{ {
*status = patterns_syntax_error; *status = patterns_syntax_error;
return 0; return 0;
} }
else if (cl_tok[1] == '-' && cl_tok[2] != ']') else if (cl_tok[1] == '-' && cl_tok[2] != ']')
{ {
if (*cl_tok <= c && c <= cl_tok[2]) if (*cl_tok <= c && c <= cl_tok[2])
*status = patterns_found; *status = patterns_found;
return 3; return 3;
} }
else else
{ {
if (c == *cl_tok) if (c == *cl_tok)
*status = patterns_found; *status = patterns_found;
return 1; return 1;
} }
} }
static Edje_Match_Error static Edje_Match_Error
_edje_match_patterns_exec_class_complement(const char *cl_tok, size_t *ret) _edje_match_patterns_exec_class_complement(const char *cl_tok, size_t *ret)
{ {
switch (*cl_tok) switch (*cl_tok)
{ {
case 0: case 0:
return EDJE_MATCH_SYNTAX_ERROR; return EDJE_MATCH_SYNTAX_ERROR;
case '!': case '!':
*ret = 1; *ret = 1;
return EDJE_MATCH_OK; return EDJE_MATCH_OK;
default: default:
*ret = 0; *ret = 0;
return EDJE_MATCH_OK; return EDJE_MATCH_OK;
} }
} }
static Edje_Match_Error static Edje_Match_Error
@ -178,24 +178,26 @@ _edje_match_patterns_exec_class(const char *cl,
enum status status = patterns_not_found; enum status status = patterns_not_found;
int pos = 1; int pos = 1;
size_t neg; size_t neg;
if (_edje_match_patterns_exec_class_complement(cl + 1, &neg) != EDJE_MATCH_OK) if (_edje_match_patterns_exec_class_complement(cl + 1, &neg) != EDJE_MATCH_OK)
return EDJE_MATCH_SYNTAX_ERROR; return EDJE_MATCH_SYNTAX_ERROR;
pos += neg; pos += neg;
do do
pos += _edje_match_patterns_exec_class_token(&status, cl + pos, c); {
pos += _edje_match_patterns_exec_class_token(&status, cl + pos, c);
}
while (cl[pos] && cl[pos] != ']'); while (cl[pos] && cl[pos] != ']');
if (status == patterns_syntax_error || ! cl[pos]) if (status == patterns_syntax_error || ! cl[pos])
return EDJE_MATCH_SYNTAX_ERROR; return EDJE_MATCH_SYNTAX_ERROR;
if (status == patterns_found) if (status == patterns_found)
*ret = neg ? 0 : pos + 1; *ret = neg ? 0 : pos + 1;
else else
*ret = neg ? pos + 1 : 0; *ret = neg ? pos + 1 : 0;
return EDJE_MATCH_OK; return EDJE_MATCH_OK;
} }
@ -389,8 +391,10 @@ _edje_match_collection_dir_exec_finals(const size_t *finals,
size_t i; size_t i;
for (i = 0; i < states->size; ++i) for (i = 0; i < states->size; ++i)
if (states->states[i].pos >= finals[states->states[i].idx]) {
return EINA_TRUE; if (states->states[i].pos >= finals[states->states[i].idx])
return EINA_TRUE;
}
return EINA_FALSE; return EINA_FALSE;
} }
@ -407,20 +411,26 @@ edje_match_programs_exec_check_finals(const size_t *signal_finals,
size_t j; size_t j;
for (i = 0; i < signal_states->size; ++i) for (i = 0; i < signal_states->size; ++i)
if (signal_states->states[i].pos >= signal_finals[signal_states->states[i].idx]) {
for (j = 0; j < source_states->size; ++j) if (signal_states->states[i].pos >= signal_finals[signal_states->states[i].idx])
if (signal_states->states[i].idx == source_states->states[j].idx {
&& source_states->states[j].pos >= source_finals[source_states->states[j].idx]) for (j = 0; j < source_states->size; ++j)
{ {
Edje_Program *pr; if (signal_states->states[i].idx == source_states->states[j].idx
&& source_states->states[j].pos >= source_finals[source_states->states[j].idx])
pr = programs[signal_states->states[i].idx]; {
if (pr) Edje_Program *pr;
{
if (func(pr, data)) pr = programs[signal_states->states[i].idx];
return EINA_FALSE; if (pr)
} {
} if (func(pr, data))
return EINA_FALSE;
}
}
}
}
}
return EINA_TRUE; return EINA_TRUE;
} }
@ -442,28 +452,34 @@ edje_match_callback_exec_check_finals(const Edje_Patterns *singal_ppat,
int r = 1; int r = 1;
for (i = 0; i < signal_states->size; ++i) for (i = 0; i < signal_states->size; ++i)
if (signal_states->states[i].pos >= signal_finals[signal_states->states[i].idx]) {
for (j = 0; j < source_states->size; ++j) if (signal_states->states[i].pos >= signal_finals[signal_states->states[i].idx])
if (signal_states->states[i].idx == source_states->states[j].idx {
&& source_states->states[j].pos >= source_finals[source_states->states[j].idx]) for (j = 0; j < source_states->size; ++j)
{ {
Edje_Signal_Callback *escb; if (signal_states->states[i].idx == source_states->states[j].idx
&& source_states->states[j].pos >= source_finals[source_states->states[j].idx])
escb = eina_list_nth(callbacks, signal_states->states[i].idx); {
if (escb) Edje_Signal_Callback *escb;
{
if ((!escb->just_added) escb = eina_list_nth(callbacks, signal_states->states[i].idx);
&& (!escb->delete_me)) if (escb)
{ {
escb->func(escb->data, ed->obj, signal, source); if ((!escb->just_added)
r = 2; && (!escb->delete_me))
} {
if (_edje_block_break(ed)) escb->func(escb->data, ed->obj, signal, source);
return 0; r = 2;
if ((singal_ppat->delete_me) || (source_ppat->delete_me)) }
return 0; if (_edje_block_break(ed))
} return 0;
} if ((singal_ppat->delete_me) || (source_ppat->delete_me))
return 0;
}
}
}
}
}
return r; return r;
} }
@ -480,16 +496,16 @@ _edje_match_fn(const Edje_Patterns *ppat,
for (c = string; *c && states->size; ++c) for (c = string; *c && states->size; ++c)
{ {
size_t i; size_t i;
_edje_match_states_clear(new_states, ppat->patterns_size, ppat->max_length); _edje_match_states_clear(new_states, ppat->patterns_size, ppat->max_length);
for (i = 0; i < states->size; ++i) for (i = 0; i < states->size; ++i)
{ {
const size_t idx = states->states[i].idx; const size_t idx = states->states[i].idx;
const size_t pos = states->states[i].pos; const size_t pos = states->states[i].pos;
if (!ppat->patterns[idx][pos]) if (!ppat->patterns[idx][pos])
continue; continue;
else if (ppat->patterns[idx][pos] == '*') else if (ppat->patterns[idx][pos] == '*')
{ {
_edje_match_states_insert(states, ppat->max_length, idx, pos + 1); _edje_match_states_insert(states, ppat->max_length, idx, pos + 1);
@ -498,22 +514,22 @@ _edje_match_fn(const Edje_Patterns *ppat,
else else
{ {
size_t m; size_t m;
if (_edje_match_patterns_exec_token(ppat->patterns[idx] + pos, if (_edje_match_patterns_exec_token(ppat->patterns[idx] + pos,
*c, *c,
&m) != EDJE_MATCH_OK) &m) != EDJE_MATCH_OK)
return NULL; return NULL;
if (m) if (m)
_edje_match_states_insert(new_states, ppat->max_length, idx, pos + m); _edje_match_states_insert(new_states, ppat->max_length, idx, pos + m);
} }
} }
{ {
Edje_States *tmp = states; Edje_States *tmp = states;
states = new_states; states = new_states;
new_states = tmp; new_states = tmp;
} }
} }
return states; return states;
@ -529,9 +545,9 @@ edje_match_collection_dir_exec(const Edje_Patterns *ppat,
_edje_match_patterns_exec_init_states(ppat->states, ppat->patterns_size, ppat->max_length); _edje_match_patterns_exec_init_states(ppat->states, ppat->patterns_size, ppat->max_length);
result = _edje_match_fn(ppat, string, ppat->states); result = _edje_match_fn(ppat, string, ppat->states);
if (result) if (result)
r = _edje_match_collection_dir_exec_finals(ppat->finals, result); r = _edje_match_collection_dir_exec_finals(ppat->finals, result);
return r; return r;
} }
@ -560,13 +576,13 @@ edje_match_programs_exec(const Edje_Patterns *ppat_signal,
source_result = _edje_match_fn(ppat_source, source, ppat_source->states); source_result = _edje_match_fn(ppat_source, source, ppat_source->states);
if (signal_result && source_result) if (signal_result && source_result)
r = edje_match_programs_exec_check_finals(ppat_signal->finals, r = edje_match_programs_exec_check_finals(ppat_signal->finals,
ppat_source->finals, ppat_source->finals,
signal_result, signal_result,
source_result, source_result,
programs, programs,
func, func,
data); data);
return r; return r;
} }
@ -595,16 +611,16 @@ edje_match_callback_exec(Edje_Patterns *ppat_signal,
source_result = _edje_match_fn(ppat_source, source, ppat_source->states); source_result = _edje_match_fn(ppat_source, source, ppat_source->states);
if (signal_result && source_result) if (signal_result && source_result)
r = edje_match_callback_exec_check_finals(ppat_signal, r = edje_match_callback_exec_check_finals(ppat_signal,
ppat_source, ppat_source,
ppat_signal->finals, ppat_signal->finals,
ppat_source->finals, ppat_source->finals,
signal_result, signal_result,
source_result, source_result,
signal, signal,
source, source,
callbacks, callbacks,
ed); ed);
ppat_signal->ref--; ppat_signal->ref--;
ppat_source->ref--; ppat_source->ref--;
if (ppat_signal->ref <= 0) edje_match_patterns_free(ppat_signal); if (ppat_signal->ref <= 0) edje_match_patterns_free(ppat_signal);
@ -670,35 +686,35 @@ edje_match_program_hash_build(Edje_Program * const *programs,
Eina_List *result = NULL; Eina_List *result = NULL;
Eina_Rbtree *new = NULL; Eina_Rbtree *new = NULL;
unsigned int i; unsigned int i;
for (i = 0; i < count; ++i) for (i = 0; i < count; ++i)
{ {
if (programs[i]->signal && !strpbrk(programs[i]->signal, "*?[\\") if (programs[i]->signal && !strpbrk(programs[i]->signal, "*?[\\")
&& programs[i]->source && !strpbrk(programs[i]->source, "*?[\\")) && programs[i]->source && !strpbrk(programs[i]->source, "*?[\\"))
{ {
Edje_Signal_Source_Char *item; Edje_Signal_Source_Char *item;
item = (Edje_Signal_Source_Char*) eina_rbtree_inline_lookup(new, programs[i]->signal, 0, item = (Edje_Signal_Source_Char*) eina_rbtree_inline_lookup(new, programs[i]->signal, 0,
EINA_RBTREE_CMP_KEY_CB(_edje_signal_source_key_cmp), programs[i]->source); EINA_RBTREE_CMP_KEY_CB(_edje_signal_source_key_cmp), programs[i]->source);
if (!item) if (!item)
{ {
item = malloc(sizeof (Edje_Signal_Source_Char)); item = malloc(sizeof (Edje_Signal_Source_Char));
if (!item) continue; if (!item) continue;
item->signal = programs[i]->signal; item->signal = programs[i]->signal;
item->source = programs[i]->source; item->source = programs[i]->source;
item->list = NULL; item->list = NULL;
new = eina_rbtree_inline_insert(new, EINA_RBTREE_GET(item), new = eina_rbtree_inline_insert(new, EINA_RBTREE_GET(item),
EINA_RBTREE_CMP_NODE_CB(_edje_signal_source_node_cmp), NULL); EINA_RBTREE_CMP_NODE_CB(_edje_signal_source_node_cmp), NULL);
} }
item->list = eina_list_prepend(item->list, programs[i]); item->list = eina_list_prepend(item->list, programs[i]);
} }
else else
result = eina_list_prepend(result, programs[i]); result = eina_list_prepend(result, programs[i]);
} }
*tree = new; *tree = new;
return result; return result;
} }
@ -718,26 +734,26 @@ edje_match_callback_hash_build(const Eina_List *callbacks,
&& callback->source && !strpbrk(callback->source, "*?[\\")) && callback->source && !strpbrk(callback->source, "*?[\\"))
{ {
Edje_Signal_Source_Char *item; Edje_Signal_Source_Char *item;
item = (Edje_Signal_Source_Char*) eina_rbtree_inline_lookup(new, callback->signal, 0, item = (Edje_Signal_Source_Char*) eina_rbtree_inline_lookup(new, callback->signal, 0,
EINA_RBTREE_CMP_KEY_CB(_edje_signal_source_key_cmp), callback->source); EINA_RBTREE_CMP_KEY_CB(_edje_signal_source_key_cmp), callback->source);
if (!item) if (!item)
{ {
item = malloc(sizeof (Edje_Signal_Source_Char)); item = malloc(sizeof (Edje_Signal_Source_Char));
if (!item) continue; if (!item) continue;
item->signal = callback->signal; item->signal = callback->signal;
item->source = callback->source; item->source = callback->source;
item->list = NULL; item->list = NULL;
new = eina_rbtree_inline_insert(new, EINA_RBTREE_GET(item), new = eina_rbtree_inline_insert(new, EINA_RBTREE_GET(item),
EINA_RBTREE_CMP_NODE_CB(_edje_signal_source_node_cmp), NULL); EINA_RBTREE_CMP_NODE_CB(_edje_signal_source_node_cmp), NULL);
} }
item->list = eina_list_prepend(item->list, callback); item->list = eina_list_prepend(item->list, callback);
} }
else else
result = eina_list_prepend(result, callback); result = eina_list_prepend(result, callback);
} }
*tree = new; *tree = new;

View File

@ -96,7 +96,7 @@ edje_object_message_handler_set(Evas_Object *obj, void (*func) (void *data, Evas
EAPI void EAPI void
edje_object_message_signal_process(Evas_Object *obj) edje_object_message_signal_process(Evas_Object *obj)
{ {
Eina_List *l, *tmpq = NULL; Eina_List *l, *ln, *tmpq = NULL;
Edje *ed; Edje *ed;
Edje_Message *em; Edje_Message *em;
const void *data; const void *data;
@ -104,12 +104,17 @@ edje_object_message_signal_process(Evas_Object *obj)
ed = _edje_fetch(obj); ed = _edje_fetch(obj);
if (!ed) return; if (!ed) return;
EINA_LIST_FOREACH(msgq, l, em) for (l = msgq; l; )
if (em->edje == ed) {
tmpq = eina_list_append(tmpq, em); ln = l->next;
/* now remove them from the old queue */ em = l->data;
EINA_LIST_FOREACH(tmpq, l, data) if (em->edje == ed)
msgq = eina_list_remove(msgq, data); {
tmpq = eina_list_append(tmpq, em);
msgq = eina_list_remove_list(msgq, l);
}
l = ln;
}
/* a temporary message queue */ /* a temporary message queue */
if (tmp_msgq) if (tmp_msgq)
{ {

View File

@ -1144,7 +1144,7 @@ _edje_emit_handle(Edje *ed, const char *sig, const char *src)
if (ed->delete_me) return; if (ed->delete_me) return;
if (!sig) sig = ""; if (!sig) sig = "";
if (!src) src = ""; if (!src) src = "";
// printf("EDJE EMIT: signal: \"%s\" source: \"%s\"\n", sig, src); // printf("EDJE EMIT: (%p) signal: \"%s\" source: \"%s\"\n", ed, sig, src);
_edje_block(ed); _edje_block(ed);
_edje_ref(ed); _edje_ref(ed);
_edje_freeze(ed); _edje_freeze(ed);