From: Francois Fleuret Date: Fri, 11 Feb 2011 07:42:06 +0000 (+0100) Subject: Added the --exclamation-negates option. Increased the version number. X-Git-Url: https://fleuret.org/cgi-bin/gitweb/gitweb.cgi?p=selector.git;a=commitdiff_plain;h=a595f153fa69b0a4339ef71bcda42c1363a57687 Added the --exclamation-negates option. Increased the version number. --- diff --git a/selector.1 b/selector.1 index 7b6ec84..660e4a7 100644 --- a/selector.1 +++ b/selector.1 @@ -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 diff --git a/selector.c b/selector.c index daf2c26..e635029 100644 --- a/selector.c +++ b/selector.c @@ -45,7 +45,7 @@ #include #include -#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));