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

View File

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