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

Reply via email to