Added the --exclamation-negates option. Increased the version number.
[selector.git] / selector.c
index eb8e22f..e635029 100644 (file)
@@ -45,7 +45,7 @@
 #include <getopt.h>
 #include <limits.h>
 
-#define VERSION "1.1.2"
+#define VERSION "1.1.3"
 
 #define BUFFER_SIZE 4096
 
@@ -65,6 +65,7 @@ int use_regexp = 0;
 int case_sensitive = 0;
 char *title = 0;
 int error_flash = 0;
+int exclamation_negates = 0;
 
 int attr_modeline, attr_focus_line, attr_error;
 
@@ -186,6 +187,8 @@ void usage(FILE *out) {
   fprintf(out, "         start in regexp mode\n");
   fprintf(out, " -a, --case-sensitive\n");
   fprintf(out, "         start in case sensitive mode\n");
+  fprintf(out, " -n, --exclamation-negates\n");
+  fprintf(out, "         exclamation points in substring requires the string to be absent\n");
   fprintf(out, " -m, --monochrome\n");
   fprintf(out, "         monochrome mode\n");
   fprintf(out, " -q, --no-beep\n");
@@ -312,12 +315,32 @@ int match(matcher_t *matcher, char *string) {
   int n;
   if(matcher->nb_patterns >= 0) {
     if(matcher->case_sensitive) {
-      for(n = 0; n < matcher->nb_patterns; n++) {
-        if(strstr(string, matcher->patterns[n]) == 0) return 0;
+      if(exclamation_negates) {
+        for(n = 0; n < matcher->nb_patterns; n++) {
+          if(matcher->patterns[n][0] == '!') {
+            if(strstr(string, matcher->patterns[n] + 1) != 0) return 0;
+          } else {
+            if(strstr(string, matcher->patterns[n]) == 0) return 0;
+          }
+        }
+      } else {
+        for(n = 0; n < matcher->nb_patterns; n++) {
+          if(strstr(string, matcher->patterns[n]) == 0) return 0;
+        }
       }
     } else {
-      for(n = 0; n < matcher->nb_patterns; n++) {
-        if(strcasestr(string, matcher->patterns[n]) == 0) return 0;
+      if(exclamation_negates) {
+        for(n = 0; n < matcher->nb_patterns; n++) {
+          if(matcher->patterns[n][0] == '!') {
+            if(strcasestr(string, matcher->patterns[n] + 1) != 0) return 0;
+          } else {
+            if(strcasestr(string, matcher->patterns[n]) == 0) return 0;
+          }
+        }
+      } else {
+        for(n = 0; n < matcher->nb_patterns; n++) {
+          if(strcasestr(string, matcher->patterns[n]) == 0) return 0;
+        }
       }
     }
     return 1;
@@ -796,7 +819,7 @@ void read_file(struct hash_table_t *hash_table,
       raw_line[BUFFER_SIZE - 1] = '\0';
       fprintf(stderr, "selector: Line too long (max is %d characters):\n",
               BUFFER_SIZE);
-      fprintf(stderr, raw_line);
+      fprintf(stderr, "%s", raw_line);
       fprintf(stderr, "\n");
       exit(EXIT_FAILURE);
     }
@@ -853,7 +876,7 @@ int main(int argc, char **argv) {
   char pattern[BUFFER_SIZE];
   int c, k, l, n;
   int cursor_position;
-  int error = 0, show_help = 0;
+  int error = 0, show_help = 0, done = 0;
   int rest_are_files = 0;
   int key;
   int current_focus_line, displayed_focus_line;
@@ -882,7 +905,7 @@ int main(int argc, char **argv) {
   strcpy(output_filename, "");
 
   while (!rest_are_files &&
-         (c = getopt_long(argc, argv, "o:s:x:vwmqf:ibzdeat:l:c:-h",
+         (c = getopt_long(argc, argv, "o:s:x:vwmqf:ibzdeant:l:c:-h",
                           long_options, NULL)) != -1) {
 
     switch(c) {
@@ -939,6 +962,10 @@ int main(int argc, char **argv) {
       case_sensitive = 1;
       break;
 
+    case 'n':
+      exclamation_negates = 1;
+      break;
+
     case 't':
       free(title);
       title = safe_malloc((strlen(optarg) + 1) * sizeof(char));
@@ -1206,14 +1233,23 @@ int main(int argc, char **argv) {
       clear();
     }
 
+    else if(key == '\007' || /* ^G */
+            key == '\033' || /* ^[ (escape) */
+            key == '\n' ||
+            key == KEY_ENTER) {
+      done = 1;
+    }
+
+    else {
+      /* Unknown key */
+      error_feedback();
+    }
+
     update_screen(&current_focus_line, &displayed_focus_line,
                   motion,
                   nb_lines, labels, cursor_position, pattern);
 
-  } while(key != '\007' && /* ^G */
-          key != '\033' && /* ^[ (escape) */
-          key != '\n' &&
-          key != KEY_ENTER);
+  } while(!done);
 
   echo();
   endwin();
@@ -1242,7 +1278,7 @@ int main(int argc, char **argv) {
       FILE *out = fopen(output_filename, "w");
       if(out) {
         if(t) {
-          fprintf(out, t);
+          fprintf(out, "%s", t);
         }
         fprintf(out, "\n");
       } else {