X-Git-Url: https://fleuret.org/cgi-bin/gitweb/gitweb.cgi?a=blobdiff_plain;f=selector.c;h=3246a0055c39d7d237f3b3a4969c99be137a10d3;hb=dd8062da09a47dfb4c1520bf3d23742b7103c00d;hp=9b8879942bec621f8257e82f45c70338af2427bc;hpb=adeac87e367824af309c8bafc0010cbe42d09c6f;p=selector.git diff --git a/selector.c b/selector.c index 9b88799..3246a00 100644 --- a/selector.c +++ b/selector.c @@ -45,7 +45,7 @@ #include #include -#define VERSION "1.1.4" +#define VERSION "1.1.5" #define BUFFER_SIZE 4096 @@ -65,8 +65,8 @@ int use_regexp = 0; int case_sensitive = 0; char *title = 0; int error_flash = 0; -int exclamation_negates = 0; int upper_caps_makes_case_sensitive = 0; +int show_long_lines = 0; int attr_modeline, attr_focus_line, attr_error; @@ -76,8 +76,9 @@ int attr_modeline, attr_focus_line, attr_error; void *safe_malloc(size_t n) { void *p = malloc(n); - if (!p && n != 0) { - printf("Can not allocate memory: %s\n", strerror(errno)); + if(!p && n != 0) { + fprintf(stderr, + "selector: can not allocate memory: %s\n", strerror(errno)); exit(EXIT_FAILURE); } return p; @@ -188,11 +189,11 @@ 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, " -j, --show-long-lines\n"); + fprintf(out, " print three dots at the end of truncated lines\n"); fprintf(out, " -u, --upper-case-makes-case-sensitive\n"); fprintf(out, " using an upper case character in the matching string makes\n"); fprintf(out, " the matching case-sensitive\n"); - fprintf(out, " -n, --exclamation-negates\n"); - fprintf(out, " substrings starting with an exclamation mark have to be absent\n"); fprintf(out, " -m, --monochrome\n"); fprintf(out, " monochrome mode\n"); fprintf(out, " -q, --no-beep\n"); @@ -290,7 +291,8 @@ int add_and_get_previous_index(struct hash_table_t *hash_table, /* We came back to our original code, which means that the table is full */ if(code == start) { - printf("Full hash table (that should not happen)\n"); + fprintf(stderr, + "Full hash table (that should not happen)\n"); exit(EXIT_FAILURE); } } @@ -318,32 +320,12 @@ int match(struct matcher *matcher, char *string) { int n; if(matcher->nb_patterns >= 0) { if(matcher->case_sensitive) { - 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; - } + for(n = 0; n < matcher->nb_patterns; n++) { + if(strstr(string, matcher->patterns[n]) == 0) return 0; } } else { - 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; - } + for(n = 0; n < matcher->nb_patterns; n++) { + if(strcasestr(string, matcher->patterns[n]) == 0) return 0; } } return 1; @@ -623,15 +605,33 @@ void update_screen(int *current_focus_line, int *displayed_focus_line, /* Highlight the highlighted line ... */ if(l == new_focus_line) { - while(k < console_width) { - buffer[k++] = ' '; + if(show_long_lines && k >= console_width) { + if(console_width >= 4) { + buffer[console_width - 4] = ' '; + buffer[console_width - 3] = '.'; + buffer[console_width - 2] = '.'; + buffer[console_width - 1] = '.'; + } + } else { + while(k < console_width) { + buffer[k++] = ' '; + } } attron(attr_focus_line); addnstr(buffer, console_width); attroff(attr_focus_line); } else { - buffer[k++] = '\n'; - buffer[k++] = '\0'; + if(show_long_lines && k >= console_width) { + if(console_width >= 4) { + buffer[console_width - 4] = ' '; + buffer[console_width - 3] = '.'; + buffer[console_width - 2] = '.'; + buffer[console_width - 1] = '.'; + } + } else { + buffer[k++] = '\n'; + buffer[k++] = '\0'; + } /* clrtoeol(); */ addnstr(buffer, console_width); } @@ -791,7 +791,7 @@ void read_file(struct hash_table_t *hash_table, exit(EXIT_FAILURE); } - while(*nb_lines < nb_lines_max && (fgets(raw_line, BUFFER_SIZE, file))) { + while(*nb_lines < nb_lines_max && fgets(raw_line, BUFFER_SIZE, file)) { for(s = raw_line + strlen(raw_line) - 1; s > raw_line && *s == '\n'; s--) { *s = '\0'; } @@ -824,6 +824,7 @@ static struct option long_options[] = { { "remove-duplicates", no_argument, 0, 'd' }, { "regexp", no_argument, 0, 'e' }, { "case-sensitive", no_argument, 0, 'a' }, + { "show-long-lines", no_argument, 0, 'j'}, { "upper-case-makes-case-sensitive", no_argument, 0, 'u' }, { "title", 1, 0, 't' }, { "number-of-lines", 1, 0, 'l' }, @@ -866,7 +867,7 @@ int main(int argc, char **argv) { strcpy(output_filename, ""); - while ((c = getopt_long(argc, argv, "o:s:x:vwmqf:ibzdeaunt:l:c:-h", + while ((c = getopt_long(argc, argv, "o:s:x:vwmqf:ibzdeajunt:l:c:-h", long_options, NULL)) != -1) { switch(c) { @@ -923,12 +924,12 @@ int main(int argc, char **argv) { case_sensitive = 1; break; - case 'u': - upper_caps_makes_case_sensitive = 1; + case 'j': + show_long_lines = 1; break; - case 'n': - exclamation_negates = 1; + case 'u': + upper_caps_makes_case_sensitive = 1; break; case 't': @@ -1221,7 +1222,7 @@ int main(int argc, char **argv) { /* Here we come back to standard display */ - if((key == KEY_ENTER || key == '\n')) { + if(key == KEY_ENTER || key == '\n') { char *t;