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;
 }
 

-- 


Reply via email to