Hello e people,I have written a little example app for eio_file_stat_ls() that could have its place under "trunk/eio/src/examples/" or "trunk/EXAMPLES/eio/".
I think this could help people that needs to use it.It also warns about the filter_cb being called in eio's thread. A trap i stepped on by badly reading the doc (totally my fault).
Example file is attached to this mail.
/* * Compile : * gcc -g -o eio_file_stat_ls eio_file_stat_ls.c `pkg-config --cflags --libs eina ecore eio` * * Prepare : * mkdir test * touch test/456 * touch test/excluded * touch test/backuped * * Run : * ./eio_file_stat_ls test */ #include <Eio.h> #include <regex.h> struct _Filter { const char *name; regex_t preg; }; Eina_List *l_filters; unsigned int count_filtered, count_passed, jobs; Eina_Bool _list_cb_filter(void *data, Eio_File *handler, const Eina_File_Direct_Info *file); void _list_cb(void *data, Eio_File *handler, const Eina_File_Direct_Info *file); void _list_cb_done(void *data, Eio_File *handler); void _list_cb_error(void *data, Eio_File *handler, int error); void _free_cb(void *data) { return; } void _filter_add(const char *name) { struct _Filter *obj; obj = calloc(1, sizeof(struct _Filter)); if (!obj) return; if (regcomp(&(obj->preg), name, REG_EXTENDED)) { fprintf(stderr, "Failed to compile regex for \"%s\"\n", name); free(obj); return; } obj->name = eina_stringshare_add(name); l_filters = eina_list_append(l_filters, obj); } /* * This function is called inside eio's thread, so dont use anything not * thread-safe inside! */ Eina_Bool _list_cb_filter(void *data, Eio_File *handler, const Eina_File_Direct_Info *file) { char *last_slash; struct _Filter *obj_filter; Eina_List *l; last_slash = strrchr(file->path, '/'); if (file->type==EINA_FILE_DIR) return EINA_TRUE; EINA_LIST_FOREACH(l_filters, l, obj_filter) { if (!regexec(&(obj_filter->preg), last_slash + 1, 0, 0, 0)) { eio_file_associate_add(handler, file->path, obj_filter, _free_cb); return EINA_TRUE; } } count_filtered++; return EINA_FALSE; } void _list_cb(void *data, Eio_File *handler, const Eina_File_Direct_Info *file) { struct _Filter *obj; if (file->type==EINA_FILE_DIR) { jobs++; eio_file_stat_ls(file->path, _list_cb_filter, _list_cb, _list_cb_done, _list_cb_error, NULL); return; } count_passed++; obj = eio_file_associate_find(handler, file->path); printf("File %s matched %s\n", file->path, obj->name); } void _list_cb_done(void *data, Eio_File *handler) { if (!--jobs) ecore_main_loop_quit(); } void _list_cb_error(void *data, Eio_File *handler, int error) { fprintf(stderr, "An error occured : %s\n", strerror(error)); } int main(int argc, char **argv) { if (argc != 2) { fprintf(stderr, "Usage ./eio_file_stat_ls testdir\n"); return 1; } eina_init(); ecore_init(); eio_init(); l_filters = NULL; count_filtered = 0; count_passed = 0; jobs = 1; _filter_add("^[0-9]+$"); _filter_add("^back.*"); eio_file_stat_ls(argv[1], _list_cb_filter, _list_cb, _list_cb_done, _list_cb_error, NULL); ecore_main_loop_begin(); printf("Stats :\tFiltered = %d\tPassed = %d\n", count_filtered, count_passed); eio_shutdown(); ecore_shutdown(); eina_shutdown(); return 0; }
<<attachment: guillaume_friloux.vcf>>
------------------------------------------------------------------------------ Got visibility? Most devs has no idea what their production app looks like. Find out how fast your code is with AppDynamics Lite. http://ad.doubleclick.net/clk;262219671;13503038;y? http://info.appdynamics.com/FreeJavaPerformanceDownload.html
_______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel