about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--rf.18
-rw-r--r--rf.c27
2 files changed, 26 insertions, 9 deletions
diff --git a/rf.1 b/rf.1
index 1e8e08d..27e9ce8 100644
--- a/rf.1
+++ b/rf.1
@@ -18,7 +18,7 @@ will find files based on simple substring patterns.
 Show help message.
 
 .TP
-.B "\-v, \-\-version"
+.B "\-V, \-\-version"
 .br
 Show version.
 
@@ -27,6 +27,11 @@ Show version.
 .br
 Only show the basename of results.
 
+.TP
+.B "\-v, \-\-invert"
+.br
+Invert matches.
+
 .SH PATTERNS
 Files and directories can be found using very simple patterns.
 
@@ -50,6 +55,5 @@ will just match at any point in the filename.
 .BR find (1),
 .BR rg (1)
 
-
 .SH COPYRIGHT
 Copyright \(co 2019 Rory Bradford <roryrjb@gmail.com>.
diff --git a/rf.c b/rf.c
index b1f33d7..0e0d87e 100644
--- a/rf.c
+++ b/rf.c
@@ -15,6 +15,7 @@
 
 struct switches {
   int basename;
+  int invert;
 };
 
 int version(char *error) {
@@ -30,8 +31,9 @@ int usage(char *error) {
   fprintf(stderr, "Usage: %s [OPTIONS]\n", NAME);
   fprintf(stderr, "\nOptions:\n");
   fprintf(stderr, "  --basename, -b   only show basename in results\n");
+  fprintf(stderr, "  --invert, -v     invert matching\n");
   fprintf(stderr, "  --help, -h       show help\n");
-  fprintf(stderr, "  --version        show version\n");
+  fprintf(stderr, "  --version, -V    show version\n");
   fprintf(stderr, "\n");
 
   return version(error);
@@ -127,7 +129,6 @@ void recurse_find(char **patterns, int *pattern_count, char *dirname,
 
     while ((entry = readdir(dir)) != NULL) {
       int matched = 0;
-      char *parsed = NULL;
 
       switch (entry->d_type) {
       case DT_DIR:
@@ -150,6 +151,7 @@ void recurse_find(char **patterns, int *pattern_count, char *dirname,
           char *pattern = patterns[p];
           char first = pattern[0];
           char last = pattern[strlen(pattern) - 1];
+          char *parsed = NULL;
 
           if (last == '$' && first == '^') {
             // show everything
@@ -183,6 +185,10 @@ void recurse_find(char **patterns, int *pattern_count, char *dirname,
               matched = 1;
             }
           }
+
+          if (parsed != NULL) {
+            free(parsed);
+          }
         }
 
         break;
@@ -190,11 +196,10 @@ void recurse_find(char **patterns, int *pattern_count, char *dirname,
         break;
       }
 
-      if (matched) {
+      if ((matched && (switches->invert == 0)) ||
+          (matched == 0 && (switches->invert == 1))) {
         print_result(path, switches, entry);
       }
-
-      free(parsed);
     }
 
     closedir(dir);
@@ -203,11 +208,13 @@ void recurse_find(char **patterns, int *pattern_count, char *dirname,
 
 int main(int argc, char **argv) {
   static struct option options[] = {{"basename", no_argument, 0, 0},
+                                    {"invert", no_argument, 0, 0},
                                     {"version", no_argument, 0, 0},
                                     {"help", no_argument, 0, 0},
                                     {0, 0, 0, 0}};
 
   int basename = 0;
+  int invert = 0;
 
   int index = 0;
   int res;
@@ -221,11 +228,13 @@ int main(int argc, char **argv) {
         return usage(NULL);
       } else if (strcmp("basename", options[index].name) == 0) {
         basename = 1;
+      } else if (strcmp("invert", options[index].name) == 0) {
+        invert = 1;
       }
 
       break;
 
-    case 'v':
+    case 'V':
       return version(NULL);
 
     case 'h':
@@ -234,6 +243,10 @@ int main(int argc, char **argv) {
     case 'b':
       basename = 1;
       break;
+
+    case 'v':
+      invert = 1;
+      break;
     }
   }
 
@@ -251,7 +264,7 @@ int main(int argc, char **argv) {
       patterns[i] = argv[i + 1];
     }
 
-    struct switches switches = {.basename = basename};
+    struct switches switches = {.basename = basename, .invert = invert};
 
     recurse_find(patterns, &pattern_count, ".", &switches);
     free(patterns);