Added the --exclamation-negates option. Increased the version number.
authorFrancois Fleuret <francois@fleuret.org>
Fri, 11 Feb 2011 07:42:06 +0000 (08:42 +0100)
committerFrancois Fleuret <francois@fleuret.org>
Fri, 11 Feb 2011 07:42:06 +0000 (08:42 +0100)
selector.1
selector.c

index 7b6ec84..660e4a7 100644 (file)
@@ -84,6 +84,10 @@ start in regexp mode
 \fB-a\fR, \fB--case-sensitive\fR
 start in case sensitive mode
 .TP
+\fB-n\fR, \fB--exclamation-negates\fR
+substrings starting with an exclamation point must be absent for a line
+to match
+.TP
 \fB-q\fR, \fB--no-beep\fR
 make a flash instead of a beep when there is an edition error
 .TP
index daf2c26..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;
@@ -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));