q66 pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=8e8dbc322edc147cf13c3a6ce93306d692d0c908
commit 8e8dbc322edc147cf13c3a6ce93306d692d0c908 Author: Daniel Kolesa <[email protected]> Date: Mon Jul 7 14:22:41 2014 +0100 eolian: scan directories recursively --- src/lib/eolian/Eolian.h | 3 ++- src/lib/eolian/eolian_database.c | 40 ++++++++++++++++++++++++---------------- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/lib/eolian/Eolian.h b/src/lib/eolian/Eolian.h index a7e4bc2..cf80513 100644 --- a/src/lib/eolian/Eolian.h +++ b/src/lib/eolian/Eolian.h @@ -160,7 +160,8 @@ EAPI int eolian_init(void); EAPI int eolian_shutdown(void); /* - * @brief Scan the given directory and search for .eo and .eot files. + * @brief Scan the given directory (recursively) and search for .eo and + * .eot files. * * The found files are just open to extract the class name. * diff --git a/src/lib/eolian/eolian_database.c b/src/lib/eolian/eolian_database.c index 1b281ff..5e34acf 100644 --- a/src/lib/eolian/eolian_database.c +++ b/src/lib/eolian/eolian_database.c @@ -1550,27 +1550,35 @@ eolian_show(const Eolian_Class class) #define EO_SUFFIX ".eo" #define EOT_SUFFIX ".eot" -#define EO_SCAN_BODY(suffix, hash) \ -if (eina_str_has_suffix(file, suffix)) \ - { \ - int len = strlen(file); \ - int idx = len - 1; \ - while (idx >= 0 && file[idx] != '/' && file[idx] != '\\') idx--; \ - eina_hash_add(hash, eina_stringshare_add_length(file+idx+1, len - idx - sizeof(suffix)), strdup(file)); \ - } + +static char * +join_path(const char *path, const char *file) +{ + Eina_Strbuf *buf = eina_strbuf_new(); + + eina_strbuf_append(buf, path); + eina_strbuf_append_char(buf, '/'); + eina_strbuf_append(buf, file); + + return eina_strbuf_string_steal(buf); +} + +static void +_scan_cb(const char *name, const char *path, void *data EINA_UNUSED) +{ + size_t len; + Eina_Bool is_eo = eina_str_has_suffix(name, EO_SUFFIX); + if (!is_eo && !eina_str_has_suffix(name, EOT_SUFFIX)) return; + len = strlen(name) - (is_eo ? sizeof(EO_SUFFIX) : sizeof(EOT_SUFFIX)) + 1; + eina_hash_add(is_eo ? _filenames : _tfilenames, + eina_stringshare_add_length(name, len), join_path(path, name)); +} EAPI Eina_Bool eolian_directory_scan(const char *dir) { if (!dir) return EINA_FALSE; - char *file; - /* Get all files from directory. Not recursively!!! */ - Eina_Iterator *dir_files = eina_file_ls(dir); - EINA_ITERATOR_FOREACH(dir_files, file) EO_SCAN_BODY(EO_SUFFIX, _filenames); - eina_iterator_free(dir_files); - dir_files = eina_file_ls(dir); - EINA_ITERATOR_FOREACH(dir_files, file) EO_SCAN_BODY(EOT_SUFFIX, _tfilenames); - eina_iterator_free(dir_files); + eina_file_dir_list(dir, EINA_TRUE, _scan_cb, NULL); return EINA_TRUE; } --
