/*
- * selector is a simple shell command for selection of strings with a
- * dynamic pattern-matching.
+ * selector is a simple command line utility for selection of strings
+ * with a dynamic pattern-matching.
*
* Copyright (c) 2009 Francois Fleuret
* Written by Francois Fleuret <francois@fleuret.org>
int case_sensitive = 0;
char *title = 0;
+#define COLOR_MODELINE 1
+#define COLOR_HIGHLIGHTED_LINE 2
+
//////////////////////////////////////////////////////////////////////
void inject_into_tty_buffer(char *string) {
}
}
+int string_to_positive_integer(char *string) {
+ int error = 0;
+ int result = 0;
+
+ if(*string) {
+ for(char *s = string; *s; s++) {
+ if(*s >= '0' && *s <= '9') {
+ result = result * 10 + int(*s - '0');
+ } else error = 1;
+ }
+ } else error = 1;
+
+ if(error) {
+ cerr << "Value `" << string << "' is not a positive integer." << endl;
+ exit(1);
+ }
+
+ return result;
+}
+
+void error_feedback() {
+ flash();
+}
+
//////////////////////////////////////////////////////////////////////
// A quick and dirty hash table
buffer[c] = buffer[c+1];
c++;
}
- }
+ } else error_feedback();
}
void backspace_char(char *buffer, int *position) {
}
(*position)--;
- }
+ } else error_feedback();
}
void insert_char(char *buffer, int *position, char character) {
c++;
buffer[c] = '\0';
buffer[(*position)++] = character;
- }
+ } else error_feedback();
}
void kill_before_cursor(char *buffer, int *position) {
if(l == new_line) {
if(with_colors) {
- attron(COLOR_PAIR(2));
+ attron(COLOR_PAIR(COLOR_HIGHLIGHTED_LINE));
addnstr(buffer, console_width);
- attroff(COLOR_PAIR(2));
+ attroff(COLOR_PAIR(COLOR_HIGHLIGHTED_LINE));
} else {
attron(A_STANDOUT);
addnstr(buffer, console_width);
move(0, 0);
if(with_colors) {
- attron(COLOR_PAIR(1));
+ attron(COLOR_PAIR(COLOR_MODELINE));
} else {
attron(A_REVERSE);
}
addstr(" ");
}
- if(use_regexp) {
- addstr(" [regexp]");
+ if(use_regexp || case_sensitive) {
+ addstr("[");
+ if(use_regexp) {
+ addstr("regexp");
+ }
+
+ if(case_sensitive) {
+ if(use_regexp) {
+ addstr(",");
+ }
+ addstr("case");
+ }
+ addstr("]");
}
move(0, cursor_x);
if(with_colors) {
- attroff(COLOR_PAIR(1));
+ attroff(COLOR_PAIR(COLOR_MODELINE));
} else {
attroff(A_REVERSE);
}
else if(strcmp(argv[i], "-l") == 0) {
check_opt(argc, argv, i, 1, "<maximum number of lines>");
- nb_lines_max = atoi(argv[i+1]);
+ nb_lines_max = string_to_positive_integer(argv[i+1]);
i += 2;
}
else if(strcmp(argv[i], "-c") == 0) {
check_opt(argc, argv, i, 4, "<fg modeline> <bg modeline> <fg highlight> <bg highlight>");
- color_fg_modeline = atoi(argv[i+1]);
- color_bg_modeline = atoi(argv[i+2]);
- color_fg_highlight = atoi(argv[i+3]);
- color_bg_highlight = atoi(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]);
+ color_bg_highlight = string_to_positive_integer(argv[i + 4]);
i += 5;
}
hash_table = new_hash_table(hash_table_size);
}
- // if(i == argc && !input_filename[0]) {
- // cerr << "You must provide a filename." << endl;
- // exit(1);
- // }
-
if(input_filename[0]) {
read_file(input_filename,
nb_lines_max, &nb_lines, lines,
noecho();
- // Hide the cursor
- // curs_set(0);
-
// So that the arrow keys work
keypad(stdscr, TRUE);
if(with_colors) {
+
if(has_colors()) {
+
start_color();
+
if(color_fg_modeline < 0 || color_fg_modeline >= COLORS ||
color_bg_modeline < 0 || color_bg_modeline >= COLORS ||
color_fg_highlight < 0 || color_bg_highlight >= COLORS ||
color_bg_highlight < 0 || color_bg_highlight >= COLORS) {
echo();
- // curs_set(1);
endwin();
cerr << "Color numbers have to be between 0 and " << COLORS - 1 << "." << endl;
exit(1);
}
- init_pair(1, color_fg_modeline, color_bg_modeline);
- init_pair(2, color_fg_highlight, color_bg_highlight);
- init_pair(3, color_bg_modeline, color_fg_modeline);
+
+ init_pair(COLOR_MODELINE, color_fg_modeline, color_bg_modeline);
+ init_pair(COLOR_HIGHLIGHTED_LINE, color_fg_highlight, color_bg_highlight);
+
} else {
with_colors = 0;
}
else if(key == KEY_LEFT ||
key == '\002') { // ^B
if(cursor_position > 0) cursor_position--;
+ else error_feedback();
}
else if(key == KEY_RIGHT ||
key == '\006') { // ^F
if(pattern[cursor_position]) cursor_position++;
+ else error_feedback();
}
else if(key == '\001') { // ^A
use_regexp = !use_regexp;
}
+ else if(key == '\011') { // ^I
+ case_sensitive = !case_sensitive;
+ }
+
else if(key == '\025') { // ^U
kill_before_cursor(pattern, &cursor_position);
}
} while(key != '\n' && key != KEY_ENTER && key != '\007'); // ^G
echo();
- // curs_set(1);
endwin();
//////////////////////////////////////////////////////////////////////
}
out.flush();
}
-
+ } else {
+ cout << "Aborted." << endl;
}
for(int l = 0; l < nb_lines; l++) {