X-Git-Url: https://fleuret.org/cgi-bin/gitweb/gitweb.cgi?a=blobdiff_plain;f=selector.c;h=d7e08204d63867e377254e0204ec30aba631603a;hb=6ccee7147beee31735fe9c7dddb7a91b370f21d5;hp=0bdcd1ec5fbbe243a42ef8d1bf0ee47bbeaae469;hpb=27783ac87a15916381959b883e28c97959700970;p=selector.git diff --git a/selector.c b/selector.c index 0bdcd1e..d7e0820 100644 --- a/selector.c +++ b/selector.c @@ -67,7 +67,7 @@ int attr_modeline, attr_focus_line, attr_error; /*********************************************************************/ -void inject_into_tty_buffer(char *string) { +void inject_into_tty_buffer(char *string, int add_control_qs) { struct termios oldtio, newtio; const char *k; const char control_q = '\021'; @@ -111,7 +111,9 @@ int string_to_positive_integer(char *string) { } else error = 1; if(error) { - fprintf(stderr, "Selector: Value `%s' is not a positive integer.\n", string); + fprintf(stderr, + "Selector: Value `%s' is not a positive integer.\n", + string); exit(1); } @@ -126,11 +128,13 @@ void error_feedback() { } } +/*********************************************************************/ + /* A quick and dirty hash table */ -/* The table itself stores indexes of the strings taken in a char - **table. When a string is added, if it was already in the table, - **the new index replaces the previous one. */ +/* The table itself stores indexes of the strings taken in a char** + table. When a string is added, if it was already in the table, the + new index replaces the previous one. */ typedef struct { int size; @@ -163,7 +167,8 @@ void free_hash_table(hash_table_t *hash_table) { the previous index it had. */ int add_and_get_previous_index(hash_table_t *hash_table, - const char *new_string, int new_index, char **strings) { + const char *new_string, int new_index, + char **strings) { unsigned int code = 0; int k; @@ -247,7 +252,8 @@ void initialize_matcher(int use_regexp, int case_sensitive, if(use_regexp) { matcher->nb_patterns = -1; - matcher->regexp_error = regcomp(&matcher->preg, pattern, case_sensitive ? 0 : REG_ICASE); + matcher->regexp_error = regcomp(&matcher->preg, pattern, + case_sensitive ? 0 : REG_ICASE); } else { matcher->regexp_error = 0; matcher->nb_patterns = 1; @@ -259,8 +265,11 @@ void initialize_matcher(int use_regexp, int case_sensitive, } } - matcher->splitted_patterns = (char *) malloc((strlen(pattern) + 1) * sizeof(char)); - matcher->patterns = (char **) malloc(matcher->nb_patterns * sizeof(char *)); + matcher->splitted_patterns = + (char *) malloc((strlen(pattern) + 1) * sizeof(char)); + + matcher->patterns = + (char **) malloc(matcher->nb_patterns * sizeof(char *)); strcpy(matcher->splitted_patterns, pattern); @@ -337,13 +346,15 @@ void kill_after_cursor(char *buffer, int *position) { /*********************************************************************/ -int previous_visible(int current_line, int nb_lines, char **lines, matcher_t *matcher) { +int previous_visible(int current_line, int nb_lines, char **lines, + matcher_t *matcher) { int line = current_line - 1; while(line >= 0 && !match(lines[line], matcher)) line--; return line; } -int next_visible(int current_line, int nb_lines, char **lines, matcher_t *matcher) { +int next_visible(int current_line, int nb_lines, char **lines, + matcher_t *matcher) { int line = current_line + 1; while(line < nb_lines && !match(lines[line], matcher)) line++; @@ -406,9 +417,11 @@ void update_screen(int *current_focus_line, int *displayed_focus_line, if(match(lines[*current_focus_line], &matcher)) { new_focus_line = *current_focus_line; } else { - new_focus_line = next_visible(*current_focus_line, nb_lines, lines, &matcher); + new_focus_line = next_visible(*current_focus_line, nb_lines, lines, + &matcher); if(new_focus_line < 0) { - new_focus_line = previous_visible(*current_focus_line, nb_lines, lines, &matcher); + new_focus_line = previous_visible(*current_focus_line, nb_lines, lines, + &matcher); } } @@ -435,17 +448,20 @@ void update_screen(int *current_focus_line, int *displayed_focus_line, } } - /* Here new_focus_line is either a line number matching the pattern, or -1 */ + /* Here new_focus_line is either a line number matching the + pattern, or -1 */ if(new_focus_line >= 0) { - int first_line = new_focus_line, last_line = new_focus_line, nb_match = 1; + int first_line = new_focus_line, last_line = new_focus_line; + int nb_match = 1; /* We find the first and last line to show, so that the total of visible lines between them (them included) is console_height-1 */ - while(nb_match < console_height-1 && (first_line > 0 || last_line < nb_lines - 1)) { + while(nb_match < console_height-1 && + (first_line > 0 || last_line < nb_lines - 1)) { if(first_line > 0) { first_line--; @@ -688,7 +704,8 @@ void read_file(hash_table_t *hash_table, if(eol == BUFFER_SIZE) { raw_line[BUFFER_SIZE - 1] = '\0'; - fprintf(stderr, "Selector: Line too long (max is %d characters):\n", BUFFER_SIZE); + fprintf(stderr, "Selector: Line too long (max is %d characters):\n", + BUFFER_SIZE); fprintf(stderr, raw_line); fprintf(stderr, "\n"); exit(1); @@ -744,7 +761,10 @@ int main(int argc, char **argv) { strcpy(output_filename, ""); i = 1; - while(!error && !show_help && i < argc && argv[i][0] == '-' && !rest_are_files) { + + while(!error && !show_help && + i < argc && argv[i][0] == '-' && + !rest_are_files) { if(strcmp(argv[i], "-o") == 0) { check_opt(argc, argv, i, 1, ""); @@ -835,7 +855,8 @@ int main(int argc, char **argv) { } else if(strcmp(argv[i], "-c") == 0) { - check_opt(argc, argv, i, 4, " "); + check_opt(argc, argv, i, 4, + " "); color_fg_modeline = string_to_positive_integer(argv[i + 1]); color_bg_modeline = string_to_positive_integer(argv[i + 2]); color_fg_highlight = string_to_positive_integer(argv[i + 3]); @@ -870,7 +891,8 @@ int main(int argc, char **argv) { fprintf(out, "Selector version %s-R%s\n", VERSION, REVISION_NUMBER); fprintf(out, "Written by Francois Fleuret .\n"); fprintf(out, "\n"); - fprintf(out, "Usage: %s [options] [ [ ...]]\n", argv[0]); + fprintf(out, "Usage: %s [options] [ [ ...]]\n", + argv[0]); fprintf(out, "\n"); fprintf(out, " -h show this help\n"); fprintf(out, " -v inject the selected line in the tty\n"); @@ -982,7 +1004,6 @@ int main(int argc, char **argv) { initscr(); cbreak(); noecho(); - /* nonl(); */ intrflush(stdscr, FALSE); /* So that the arrow keys work */ @@ -1002,7 +1023,8 @@ int main(int argc, char **argv) { color_bg_highlight < 0 || color_bg_highlight >= COLORS) { echo(); endwin(); - fprintf(stderr, "Selector: Color numbers have to be between 0 and %d.\n", COLORS - 1); + fprintf(stderr, "Selector: Color numbers have to be between 0 and %d.\n", + COLORS - 1); exit(1); } @@ -1107,7 +1129,8 @@ int main(int argc, char **argv) { } else if(key == '\014') { /* ^L */ - /* I suspect that we may sometime mess up the display */ + /* I suspect that we may sometime mess up the display, so ^L is + here to force a full refresh */ clear(); } @@ -1140,7 +1163,7 @@ int main(int argc, char **argv) { } if(output_to_vt_buffer && t) { - inject_into_tty_buffer(t); + inject_into_tty_buffer(t, add_control_qs); } if(output_filename[0]) { @@ -1151,7 +1174,9 @@ int main(int argc, char **argv) { } fprintf(out, "\n"); } else { - fprintf(stderr, "Selector: Can not open %s for writing.\n", output_filename); + fprintf(stderr, + "Selector: Can not open %s for writing.\n", + output_filename); exit(1); } fclose(out);