login

<     >

2014-11-13 17:03:03 (UTC-02:00)

Marcel Rodrigues <marcelgmr@gmail.com>

Generalize file/dir processing.

diff --git a/rover.c b/rover.c
index 4cf7b7f..07626cb 100644
--- a/rover.c
+++ b/rover.c
@@ -75,6 +75,8 @@ struct rover_t {
 #define FLAGS       rover.flags[rover.tab]
 #define CWD         rover.cwd[rover.tab]
 
+typedef int (*PROCESS)(const char *path);
+
 void
 init_marks(marks_t *marks)
 {
@@ -416,13 +418,14 @@ cd(int reset)
 }
 
 static void
-delete_dir(const char *path)
+process_dir(PROCESS pre, PROCESS proc, PROCESS pos, const char *path)
 {
     DIR *dp;
     struct dirent *ep;
     struct stat statbuf;
     char subpath[FILENAME_MAX];
 
+    if (pre) pre(path);
     if((dp = opendir(path)) == NULL)
         return;
     while ((ep = readdir(dp))) {
@@ -432,17 +435,17 @@ delete_dir(const char *path)
         stat(subpath, &statbuf);
         if (S_ISDIR(statbuf.st_mode)) {
             strcat(subpath, "/");
-            delete_dir(subpath);
+            process_dir(pre, proc, pos, subpath);
         }
         else
-            unlink(subpath);
+            proc(subpath);
     }
     closedir(dp);
-    rmdir(path);
+    if (pos) pos(path);
 }
 
 static void
-delete_marked()
+process_marked(PROCESS pre, PROCESS proc, PROCESS pos)
 {
     int i;
     char path[FILENAME_MAX];
@@ -451,9 +454,9 @@ delete_marked()
         if (rover.marks.entries[i]) {
             sprintf(path, "%s%s", rover.marks.dirpath, rover.marks.entries[i]);
             if (strchr(rover.marks.entries[i], '/'))
-                delete_dir(path);
+                process_dir(pre, proc, pos, path);
             else
-                unlink(path);
+                proc(path);
         }
 }
 
@@ -754,7 +757,8 @@ main(int argc, char *argv[])
             update();
         }
         else if (!strcmp(key, RVK_DELETE)) {
-            delete_marked();
+            process_marked(NULL, unlink, rmdir);
+            mark_none(&rover.marks);
             cd(1);
         }
     }