Hey,
Cedric sent me his last version of his code to replace fn_match in edje
(see attachment).
As fnmatch is used in eet and evas too, and as fnmatch is not avaialble in
some platform, I would like to know if it would be a good idea to ave our
own implementation of the features of fnmatch we use in these 3 libraries.
If so, what about adding it in an existing library ?
Vincent
diff -Nrua -X exclude.cvs e17-clean/libs/edje/src/lib/edje_load.c e17-dev/libs/edje/src/lib/edje_load.c
--- e17-clean/libs/edje/src/lib/edje_load.c 2007-12-18 18:48:06.000000000 +0100
+++ e17-dev/libs/edje/src/lib/edje_load.c 2007-12-17 17:02:53.000000000 +0100
@@ -158,15 +158,16 @@
{
if (edf->collection_dir)
{
- Evas_List *l;
+ Edje_Patterns *patterns;
- for (l = edf->collection_dir->entries; l; l = l->next)
- {
- Edje_Part_Collection_Directory_Entry *ce;
-
- ce = l->data;
- if (_edje_glob_match(ce->entry, glob)) return 1;
- }
+ patterns = edje_match_collection_dir_init(edf->collection_dir->entries);
+ if (edje_match_collection_dir_exec(patterns,
+ glob))
+ {
+ edje_match_patterns_free(patterns);
+ return 1;
+ }
+ edje_match_patterns_free(patterns);
}
_edje_cache_file_unref(edf);
}
diff -Nrua -X exclude.cvs e17-clean/libs/edje/src/lib/edje_match.c e17-dev/libs/edje/src/lib/edje_match.c
--- e17-clean/libs/edje/src/lib/edje_match.c 1970-01-01 01:00:00.000000000 +0100
+++ e17-dev/libs/edje/src/lib/edje_match.c 2008-01-04 15:20:08.000000000 +0100
@@ -0,0 +1,570 @@
+#include <stdlib.h>
+#include <stddef.h>
+#include <Evas.h>
+
+#include "Edje.h"
+#include "edje_private.h"
+
+/* States manipulations. */
+
+typedef struct _Edje_State Edje_State;
+struct _Edje_State
+{
+ size_t idx;
+ size_t pos;
+};
+
+typedef struct _Edje_States Edje_States;
+struct _Edje_States
+{
+ size_t size;
+ Edje_State *states;
+ _Bool *has;
+};
+
+static void
+_edje_match_states_free(Edje_States *states,
+ size_t states_size)
+{
+ (void) states_size;
+ free(states);
+}
+
+#define ALIGN(Size) \
+ { \
+ Size--; \
+ Size |= sizeof (void*) - 1; \
+ Size++; \
+ };
+
+static Edje_States*
+_edje_match_states_alloc(size_t n,
+ size_t patterns_size,
+ size_t patterns_max_length)
+{
+ Edje_States *l;
+
+ const size_t array_len = (patterns_max_length + 1) * patterns_size;
+
+ size_t states_size;
+ size_t has_size;
+ size_t states_has_size;
+ size_t struct_size;
+
+ unsigned char *states;
+ unsigned char *has;
+
+ size_t i;
+
+ states_size = sizeof (*l->states) * array_len;
+ ALIGN(states_size);
+
+ has_size = sizeof (*l->has) * array_len;
+ ALIGN(has_size);
+
+ states_has_size = states_size + has_size;
+
+ struct_size = sizeof (*l);
+ ALIGN(struct_size);
+ struct_size += states_has_size;
+
+ l = malloc(n * struct_size);
+ if (!l) return NULL;
+
+ states = (unsigned char *) (l + n);
+ has = states + states_size;
+
+ for (i = 0; i < n; ++i)
+ {
+ l[i].states = (Edje_State *) states;
+ l[i].has = (_Bool *) has;
+ states += states_has_size;
+ has += states_has_size;
+ }
+
+ return l;
+}
+
+static void
+_edje_match_states_insert(Edje_States *list,
+ size_t patterns_max_length,
+ size_t idx,
+ size_t pos)
+{
+ {
+ const size_t i = idx * (patterns_max_length + 1) + pos;
+
+ if (list->has[i]) return;
+ list->has[i] = 1;
+ }
+
+ const size_t i = list->size;
+
+ list->states[i].idx = idx;
+ list->states[i].pos = pos;
+ ++list->size;
+}
+
+static void
+_edje_match_states_clear(Edje_States *list,
+ size_t patterns_size,
+ size_t patterns_max_length)
+{
+ list->size = 0;
+ memset(list->has, 0, patterns_size * (patterns_max_length + 1) * sizeof (*list->has));
+}
+
+/* Token manipulation. */
+
+enum status
+ {
+ patterns_not_found = 0,
+ patterns_found = 1,
+ patterns_syntax_error = 2
+ };
+
+static size_t
+_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;
+ }
+}
+
+static Edje_Match_Error
+_edje_match_patterns_exec_class_complement(const char *cl_tok, size_t *ret)
+{
+ switch (*cl_tok)
+ {
+ case 0:
+ return EDJE_MATCH_SYNTAX_ERROR;
+
+ case '!':
+ *ret = 1;
+ return EDJE_MATCH_OK;
+
+ default:
+ *ret = 0;
+ return EDJE_MATCH_OK;
+ }
+}
+
+static Edje_Match_Error
+_edje_match_patterns_exec_class(const char *cl,
+ char c,
+ size_t *ret)
+{
+ 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;
+
+ pos += neg;
+
+ do
+ 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;
+
+ if (status == patterns_found)
+ *ret = neg ? 0 : pos + 1;
+ else
+ *ret = neg ? pos + 1 : 0;
+
+ return EDJE_MATCH_OK;
+}
+
+static Edje_Match_Error
+_edje_match_patterns_exec_token(const char *tok,
+ char c,
+ size_t *ret)
+{
+ switch (*tok)
+ {
+ case '\\':
+ if (tok[1])
+ {
+ *ret = tok[1] == c ? 2 : 0;
+ return EDJE_MATCH_OK;
+ }
+ return EDJE_MATCH_SYNTAX_ERROR;
+
+ case '?':
+ *ret = 1;
+ return EDJE_MATCH_OK;
+
+ case '[':
+ return _edje_match_patterns_exec_class(tok, c, ret);
+
+ default:
+ *ret = *tok == c ? 1 : 0;
+ return EDJE_MATCH_OK;
+ }
+}
+
+static void
+_edje_match_patterns_exec_init_states(Edje_States *states,
+ size_t patterns_size,
+ size_t patterns_max_length)
+{
+ size_t i;
+
+ states->size = patterns_size;
+
+ memset(states->has,
+ 0,
+ patterns_size * (patterns_max_length + 1) * sizeof (*states->has));
+ for (i = 0; i < patterns_size; ++i)
+ {
+ states->states[i].idx = i;
+ states->states[i].pos = 0;
+ states->has[i * (patterns_max_length + 1)] = 1;
+ }
+}
+
+/* Exported function. */
+
+#define EDJE_MATCH_INIT(Func, Type, Source, Show) \
+ Edje_Patterns* \
+ Func(Evas_List *lst) \
+ { \
+ Edje_Patterns *r; \
+ size_t i; \
+ \
+ if (!lst || evas_list_count(lst) <= 0) \
+ return NULL; \
+ \
+ r = malloc(sizeof (Edje_Patterns) + \
+ evas_list_count(lst) \
+ * sizeof (*r->finals) \
+ * sizeof(*r->patterns)); \
+ if (!r) return NULL; \
+ \
+ r->patterns_size = evas_list_count(lst); \
+ r->max_length = 0; \
+ r->patterns = (const char **) r->finals + r->patterns_size + 1; \
+ \
+ for (i = 0; lst; ++i) \
+ { \
+ const char *str; \
+ Type *data; \
+ size_t j; \
+ \
+ data = evas_list_data(lst); \
+ if (!data) \
+ { \
+ free(r); \
+ return NULL; \
+ } \
+ \
+ str = data->Source; \
+ if (!str) str = ""; \
+ r->patterns[i] = str; \
+ \
+ if (Show) \
+ fprintf(stderr, "%i [%s]\n", i, str); \
+ \
+ r->finals[i] = 0; \
+ for (j = 0; str[j]; ++j) \
+ if (str[j] != '*') \
+ r->finals[i] = j + 1; \
+ \
+ if (j > r->max_length) \
+ r->max_length = j; \
+ \
+ lst = evas_list_next(lst); \
+ } \
+ \
+ return r; \
+ }
+
+EDJE_MATCH_INIT(edje_match_collection_dir_init,
+ Edje_Part_Collection_Directory_Entry,
+ entry, 0);
+EDJE_MATCH_INIT(edje_match_programs_signal_init,
+ Edje_Program,
+ signal, 0);
+EDJE_MATCH_INIT(edje_match_programs_source_init,
+ Edje_Program,
+ source, 0);
+EDJE_MATCH_INIT(edje_match_callback_signal_init,
+ Edje_Signal_Callback,
+ signal, 0);
+EDJE_MATCH_INIT(edje_match_callback_source_init,
+ Edje_Signal_Callback,
+ source, 0);
+
+static int
+_edje_match_collection_dir_exec_finals(const size_t *finals,
+ const Edje_States *states)
+{
+ size_t i;
+
+ for (i = 0; i < states->size; ++i)
+ if (states->states[i].pos >= finals[states->states[i].idx])
+ return 1;
+ return 0;
+}
+
+static int
+edje_match_programs_exec_check_finals(const size_t *signal_finals,
+ const size_t *source_finals,
+ const Edje_States *signal_states,
+ const Edje_States *source_states,
+ Evas_List *programs,
+ int (*func)(Edje_Program *pr, void *data),
+ void *data)
+{
+ size_t i;
+ 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 = evas_list_nth(programs, signal_states->states[i].idx);
+ if (pr)
+ {
+ if (func(pr, data))
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+static int
+edje_match_callback_exec_check_finals(const size_t *signal_finals,
+ const size_t *source_finals,
+ const Edje_States *signal_states,
+ const Edje_States *source_states,
+ const char *signal,
+ const char *source,
+ Evas_List *callbacks,
+ Edje *ed)
+{
+ size_t i;
+ size_t j;
+ 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 = evas_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;
+ }
+ }
+
+ return r;
+}
+
+
+static Edje_States*
+_edje_match_fn(const Edje_Patterns *ppat,
+ const char *string,
+ Edje_States *states)
+{
+ Edje_States *new_states = states + 1;
+ const char *c;
+
+ 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;
+ else if (ppat->patterns[idx][pos] == '*')
+ {
+ _edje_match_states_insert(states, ppat->max_length, idx, pos + 1);
+ _edje_match_states_insert(new_states, ppat->max_length, idx, pos);
+ }
+ else
+ {
+ size_t m;
+
+ if (_edje_match_patterns_exec_token(ppat->patterns[idx] + pos,
+ *c,
+ &m) != EDJE_MATCH_OK)
+ return NULL;
+
+ if (m)
+ _edje_match_states_insert(new_states, ppat->max_length, idx, pos + m);
+ }
+ }
+ {
+ Edje_States *tmp = states;
+
+ states = new_states;
+ new_states = tmp;
+ }
+ }
+
+ return states;
+}
+
+int
+edje_match_collection_dir_exec(const Edje_Patterns *ppat,
+ const char *string)
+{
+ Edje_States *states = _edje_match_states_alloc(2,
+ ppat->patterns_size,
+ ppat->max_length);
+ Edje_States *result;
+ int r = 0;
+
+ if (!states)
+ return 0;
+ _edje_match_patterns_exec_init_states(states, ppat->patterns_size, ppat->max_length);
+
+ result = _edje_match_fn(ppat, string, states);
+
+ if (result)
+ r = _edje_match_collection_dir_exec_finals(ppat->finals, result);
+
+ _edje_match_states_free(states, 2);
+ return r;
+}
+
+int
+edje_match_programs_exec(const Edje_Patterns *ppat_signal,
+ const Edje_Patterns *ppat_source,
+ const char *signal,
+ const char *source,
+ Evas_List *programs,
+ int (*func)(Edje_Program *pr, void *data),
+ void *data)
+{
+ Edje_States *signal_states = _edje_match_states_alloc(2,
+ ppat_signal->patterns_size,
+ ppat_signal->max_length);
+ Edje_States *source_states = _edje_match_states_alloc(2,
+ ppat_source->patterns_size,
+ ppat_source->max_length);
+ Edje_States *signal_result;
+ Edje_States *source_result;
+ int r = 0;
+
+ if (!signal_states || !source_states)
+ return 0;
+
+ _edje_match_patterns_exec_init_states(signal_states,
+ ppat_signal->patterns_size,
+ ppat_signal->max_length);
+ _edje_match_patterns_exec_init_states(source_states,
+ ppat_source->patterns_size,
+ ppat_source->max_length);
+
+ signal_result = _edje_match_fn(ppat_signal, signal, signal_states);
+ source_result = _edje_match_fn(ppat_source, source, 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);
+
+ _edje_match_states_free(source_states, 2);
+ _edje_match_states_free(signal_states, 2);
+ return r;
+}
+
+int
+edje_match_callback_exec(const Edje_Patterns *ppat_signal,
+ const Edje_Patterns *ppat_source,
+ const char *signal,
+ const char *source,
+ Evas_List *callbacks,
+ Edje *ed)
+{
+ Edje_States *signal_states = _edje_match_states_alloc(2,
+ ppat_signal->patterns_size,
+ ppat_signal->max_length);
+ Edje_States *source_states = _edje_match_states_alloc(2,
+ ppat_source->patterns_size,
+ ppat_source->max_length);
+ Edje_States *signal_result;
+ Edje_States *source_result;
+ int r = 0;
+
+ if (!signal_states || !source_states)
+ return 0;
+
+ _edje_match_patterns_exec_init_states(signal_states,
+ ppat_signal->patterns_size,
+ ppat_signal->max_length);
+ _edje_match_patterns_exec_init_states(source_states,
+ ppat_source->patterns_size,
+ ppat_source->max_length);
+
+ signal_result = _edje_match_fn(ppat_signal, signal, signal_states);
+ source_result = _edje_match_fn(ppat_source, source, source_states);
+
+ if (signal_result && source_result)
+ r = edje_match_callback_exec_check_finals(ppat_signal->finals,
+ ppat_source->finals,
+ signal_result,
+ source_result,
+ signal,
+ source,
+ callbacks,
+ ed);
+
+ _edje_match_states_free(source_states, 2);
+ _edje_match_states_free(signal_states, 2);
+ return r;
+}
+
+void
+edje_match_patterns_free(Edje_Patterns *ppat)
+{
+ free(ppat);
+}
+
diff -Nrua -X exclude.cvs e17-clean/libs/edje/src/lib/edje_private.h e17-dev/libs/edje/src/lib/edje_private.h
--- e17-clean/libs/edje/src/lib/edje_private.h 2007-12-18 18:48:06.000000000 +0100
+++ e17-dev/libs/edje/src/lib/edje_private.h 2007-12-18 18:30:54.000000000 +0100
@@ -903,9 +903,49 @@
typedef enum _Edje_Fill
{
EDJE_FILL_TYPE_SCALE = 0,
EDJE_FILL_TYPE_TILE
} Edje_Fill;
+typedef enum _Edje_Match_Error
+{
+ EDJE_MATCH_OK,
+ EDJE_MATCH_ALLOC_ERROR,
+ EDJE_MATCH_SYNTAX_ERROR
+} Edje_Match_Error;
+
+typedef struct _Edje_Patterns Edje_Patterns;
+struct _Edje_Patterns
+{
+ const char **patterns;
+ size_t patterns_size;
+ size_t max_length;
+ size_t finals[];
+};
+
+Edje_Patterns *edje_match_collection_dir_init(Evas_List *lst);
+Edje_Patterns *edje_match_programs_signal_init(Evas_List *lst);
+Edje_Patterns *edje_match_programs_source_init(Evas_List *lst);
+Edje_Patterns *edje_match_callback_signal_init(Evas_List *lst);
+Edje_Patterns *edje_match_callback_source_init(Evas_List *lst);
+
+int edje_match_collection_dir_exec(const Edje_Patterns *ppat,
+ const char *string);
+int edje_match_programs_exec(const Edje_Patterns *ppat_signal,
+ const Edje_Patterns *ppat_source,
+ const char *signal,
+ const char *source,
+ Evas_List *programs,
+ int (*func)(Edje_Program *pr, void *data),
+ void *data);
+int edje_match_callback_exec(const Edje_Patterns *ppat_signal,
+ const Edje_Patterns *ppat_source,
+ const char *signal,
+ const char *source,
+ Evas_List *callbacks,
+ Edje *ed);
+
+void edje_match_patterns_free(Edje_Patterns *ppat);
+
EAPI extern Eet_Data_Descriptor *_edje_edd_edje_file;
EAPI extern Eet_Data_Descriptor *_edje_edd_edje_style;
EAPI extern Eet_Data_Descriptor *_edje_edd_edje_style_tag;
@@ -998,7 +1040,6 @@
void _edje_text_class_hash_free(void);
Edje *_edje_fetch(Evas_Object *obj);
-int _edje_glob_match(const char *str, const char *glob);
int _edje_freeze(Edje *ed);
int _edje_thaw(Edje *ed);
int _edje_block(Edje *ed);
diff -Nrua -X exclude.cvs e17-clean/libs/edje/src/lib/edje_program.c e17-dev/libs/edje/src/lib/edje_program.c
--- e17-clean/libs/edje/src/lib/edje_program.c 2007-12-18 18:48:06.000000000 +0100
+++ e17-dev/libs/edje/src/lib/edje_program.c 2007-12-20 19:00:28.000000000 +0100
@@ -823,12 +823,46 @@
_edje_message_send(ed, EDJE_QUEUE_SCRIPT, EDJE_MESSAGE_SIGNAL, 0, &emsg);
}
+struct _Edje_Program_Data
+{
+#ifdef EDJE_PROGRAM_CACHE
+ Evas_List *matches;
+ int matched;
+#endif
+ Edje *ed;
+ const char *signal;
+ const char *source;
+};
+
+static int _edje_glob_callback(Edje_Program *pr, void *dt)
+{
+ struct _Edje_Program_Data *data = dt;
+
+#ifdef EDJE_PROGRAM_CACHE
+ data->matched++;
+#endif
+
+ _edje_program_run(data->ed, pr, 0, data->signal, data->source);
+ if (_edje_block_break(data->ed))
+ {
+#ifdef EDJE_PROGRAM_CACHE
+ evas_list_free(data->matches);
+ data->matches = NULL;
+#endif
+ return 1;
+ }
+
+#ifdef EDJE_PROGRAM_CACHE
+ data->matches = evas_list_append(data->matches, pr);
+#endif
+
+ return 0;
+}
+
/* FIXME: what if we delete the evas object??? */
void
_edje_emit_handle(Edje *ed, const char *sig, const char *src)
{
- Evas_List *l;
-
if (ed->delete_me) return;
if (!sig) sig = "";
if (!src) src = "";
@@ -883,35 +917,40 @@
#endif
if (!done)
{
-#ifdef EDJE_PROGRAM_CACHE
- int matched = 0;
- Evas_List *matches = NULL;
-#endif
+ struct _Edje_Program_Data data;
- for (l = ed->collection->programs; l; l = l->next)
- {
- Edje_Program *pr;
+ data.ed = ed;
+ data.source = src;
+ data.signal = sig;
+#ifdef EDJE_PROGRAM_CACHE
+ data.matched = 0;
+ data.matches = NULL;
+#endif
+ Edje_Patterns *signals_patterns;
+ Edje_Patterns *sources_patterns;
+
+ if (ed->collection->programs)
+ {
+ signals_patterns = edje_match_programs_signal_init(ed->collection->programs);
+ sources_patterns = edje_match_programs_source_init(ed->collection->programs);
+
+ if (edje_match_programs_exec(signals_patterns,
+ sources_patterns,
+ sig,
+ src,
+ ed->collection->programs,
+ _edje_glob_callback,
+ &data) == 0)
+ {
+ edje_match_patterns_free(signals_patterns);
+ edje_match_patterns_free(sources_patterns);
+ goto break_prog;
+ }
+
+ edje_match_patterns_free(signals_patterns);
+ edje_match_patterns_free(sources_patterns);
+ }
- pr = l->data;
- if ((_edje_glob_match(sig, pr->signal)) &&
- (_edje_glob_match(src, pr->source)))
- {
-#ifdef EDJE_PROGRAM_CACHE
- matched++;
-#endif
- _edje_program_run(ed, pr, 0, sig, src);
- if (_edje_block_break(ed))
- {
-#ifdef EDJE_PROGRAM_CACHE
- evas_list_free(matches);
-#endif
- goto break_prog;
- }
-#ifdef EDJE_PROGRAM_CACHE
- matches = evas_list_append(matches, pr);
-#endif
- }
- }
#ifdef EDJE_PROGRAM_CACHE
if (tmps)
{
@@ -920,7 +959,7 @@
evas_hash_add(ec->prog_cache.no_matches, tmps, ed);
else
ec->prog_cache.matches =
- evas_hash_add(ec->prog_cache.matches, tmps, matches);
+ evas_hash_add(ec->prog_cache.matches, tmps, data.matches);
}
#endif
}
@@ -940,25 +979,41 @@
static void
_edje_emit_cb(Edje *ed, const char *sig, const char *src)
{
- Evas_List *l;
+ Edje_Patterns *signals_patterns;
+ Edje_Patterns *sources_patterns;
+ Evas_List *l;
if (ed->delete_me) return;
_edje_ref(ed);
_edje_freeze(ed);
_edje_block(ed);
ed->walking_callbacks = 1;
- for (l = ed->callbacks; l; l = l->next)
+
+ if (ed->callbacks)
{
- Edje_Signal_Callback *escb;
+ int r;
+
+ signals_patterns = edje_match_callback_signal_init(ed->callbacks);
+ sources_patterns = edje_match_callback_source_init(ed->callbacks);
- escb = l->data;
- if ((!escb->just_added) &&
- (!escb->delete_me) &&
- (_edje_glob_match(sig, escb->signal)) &&
- (_edje_glob_match(src, escb->source)))
- escb->func(escb->data, ed->obj, sig, src);
- if (_edje_block_break(ed)) goto break_prog;
+ r = edje_match_callback_exec(signals_patterns,
+ sources_patterns,
+ sig,
+ src,
+ ed->callbacks,
+ ed);
+
+ if (!r)
+ {
+ edje_match_patterns_free(signals_patterns);
+ edje_match_patterns_free(sources_patterns);
+ goto break_prog;
+ }
+
+ edje_match_patterns_free(signals_patterns);
+ edje_match_patterns_free(sources_patterns);
}
+
ed->walking_callbacks = 0;
if ((ed->delete_callbacks) || (ed->just_added_callbacks))
{
diff -Nrua -X exclude.cvs e17-clean/libs/edje/src/lib/edje_util.c e17-dev/libs/edje/src/lib/edje_util.c
--- e17-clean/libs/edje/src/lib/edje_util.c 2007-12-18 18:48:06.000000000 +0100
+++ e17-dev/libs/edje/src/lib/edje_util.c 2007-12-18 16:16:59.000000000 +0100
@@ -1951,20 +1951,6 @@
}
int
-_edje_glob_match(const char *str, const char *glob)
-{
- if ((!glob) || (glob[0] == 0))
- {
- if ((!str) || (str[0] == 0)) return 1;
- if ((glob) && (glob[0] == '*')) return 1;
- return 0;
- }
- if (glob[0] == '*') return 1;
- if ((glob) && (str) && (!fnmatch(glob, str, 0))) return 1;
- return 0;
-}
-
-int
_edje_freeze(Edje *ed)
{
ed->freeze++;
diff -Nrua -X exclude.cvs e17-clean/libs/edje/src/lib/Makefile.am e17-dev/libs/edje/src/lib/Makefile.am
--- e17-clean/libs/edje/src/lib/Makefile.am 2007-12-18 18:48:06.000000000 +0100
+++ e17-dev/libs/edje/src/lib/Makefile.am 2007-12-17 16:04:37.000000000 +0100
@@ -34,6 +34,7 @@
edje_message_queue.c \
edje_private.h \
edje_cache.c \
+edje_match.c \
edje_textblock_styles.c
libedje_la_LIBADD = -lm @EDJE_LIBS@ @fnmatch_libs@
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel