X-Git-Url: https://fleuret.org/cgi-bin/gitweb/gitweb.cgi?p=selector.git;a=blobdiff_plain;f=selector.c;h=e635029c32fb13d70ed01fdc1e50cf21ed9d31d0;hp=0a8cf2423ccb5e5704e8fa8003296116483b8125;hb=a595f153fa69b0a4339ef71bcda42c1363a57687;hpb=d3ee5db6e344bf94671145a0ad7a5544f31ace8e diff --git a/selector.c b/selector.c index 0a8cf24..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; @@ -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); } @@ -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)); @@ -1251,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 {