Create helpers to dir_iterator_advance(). Make dir_iterator_advance()'s
code more legible and allow some behavior to be reusable.

Signed-off-by: Daniel Ferreira <bnm...@gmail.com>
---
 dir-iterator.c | 65 +++++++++++++++++++++++++++++++++++++---------------------
 1 file changed, 42 insertions(+), 23 deletions(-)

diff --git a/dir-iterator.c b/dir-iterator.c
index 34182a9..9e073a0 100644
--- a/dir-iterator.c
+++ b/dir-iterator.c
@@ -50,6 +50,43 @@ struct dir_iterator_int {
        struct dir_iterator_level *levels;
 };
 
+static void push_dir_level(struct dir_iterator_int *iter, struct 
dir_iterator_level *level)
+{
+       level->dir_state = DIR_STATE_RECURSE;
+       ALLOC_GROW(iter->levels, iter->levels_nr + 1,
+                  iter->levels_alloc);
+       level = &iter->levels[iter->levels_nr++];
+       level->initialized = 0;
+}
+
+static int pop_dir_level(struct dir_iterator_int *iter)
+{
+       return --iter->levels_nr;
+}
+
+static int set_iterator_data(struct dir_iterator_int *iter, struct 
dir_iterator_level *level)
+{
+       if (lstat(iter->base.path.buf, &iter->base.st) < 0) {
+               if (errno != ENOENT)
+                       warning("error reading path '%s': %s",
+                               iter->base.path.buf,
+                               strerror(errno));
+               return -1;
+       }
+
+       /*
+        * We have to set these each time because
+        * the path strbuf might have been realloc()ed.
+        */
+       iter->base.relative_path =
+               iter->base.path.buf + iter->levels[0].prefix_len;
+       iter->base.basename =
+               iter->base.path.buf + level->prefix_len;
+       level->dir_state = DIR_STATE_ITER;
+
+       return 0;
+}
+
 int dir_iterator_advance(struct dir_iterator *dir_iterator)
 {
        struct dir_iterator_int *iter =
@@ -84,11 +121,7 @@ int dir_iterator_advance(struct dir_iterator *dir_iterator)
                                 * over; now prepare to iterate into
                                 * it.
                                 */
-                               level->dir_state = DIR_STATE_RECURSE;
-                               ALLOC_GROW(iter->levels, iter->levels_nr + 1,
-                                          iter->levels_alloc);
-                               level = &iter->levels[iter->levels_nr++];
-                               level->initialized = 0;
+                               push_dir_level(iter, level);
                                continue;
                        } else {
                                /*
@@ -104,7 +137,7 @@ int dir_iterator_advance(struct dir_iterator *dir_iterator)
                         * This level is exhausted (or wasn't opened
                         * successfully); pop up a level.
                         */
-                       if (--iter->levels_nr == 0)
+                       if (pop_dir_level(iter) == 0)
                                return dir_iterator_abort(dir_iterator);
 
                        continue;
@@ -129,7 +162,7 @@ int dir_iterator_advance(struct dir_iterator *dir_iterator)
                                                iter->base.path.buf, 
strerror(errno));
 
                                level->dir = NULL;
-                               if (--iter->levels_nr == 0)
+                               if (pop_dir_level(iter) == 0)
                                        return dir_iterator_abort(dir_iterator);
                                break;
                        }
@@ -138,23 +171,9 @@ int dir_iterator_advance(struct dir_iterator *dir_iterator)
                                continue;
 
                        strbuf_addstr(&iter->base.path, de->d_name);
-                       if (lstat(iter->base.path.buf, &iter->base.st) < 0) {
-                               if (errno != ENOENT)
-                                       warning("error reading path '%s': %s",
-                                               iter->base.path.buf,
-                                               strerror(errno));
-                               continue;
-                       }
 
-                       /*
-                        * We have to set these each time because
-                        * the path strbuf might have been realloc()ed.
-                        */
-                       iter->base.relative_path =
-                               iter->base.path.buf + 
iter->levels[0].prefix_len;
-                       iter->base.basename =
-                               iter->base.path.buf + level->prefix_len;
-                       level->dir_state = DIR_STATE_ITER;
+                       if (set_iterator_data(iter, level))
+                               continue;
 
                        return ITER_OK;
                }
-- 
2.7.4 (Apple Git-66)

Reply via email to