// To use it as a super-history-search for bash:
//
-// alias h='./selector -i -b -v -f <(history)'
+// alias h='selector -d -i -b -v -f <(history)'
// This software is highly Linux-specific, but I would be glad to get
// patches to make it work on other OS
char **strings, int *hash_table, int hash_table_size) {
unsigned int code = 0;
+ // This is my recipe. I checked, it seems to work (as long as
+ // hash_table_size is not a multiple of 387433 that should be okay)
+
for(int k = 0; new_string[k]; k++) {
- code += int(new_string[k]) << (8 * k%4);
+ code = code * 387433 + (unsigned int) (new_string[k]);
}
code = code % hash_table_size;
void update_screen(int *current_line, int *temporary_line, int motion,
int nb_lines, char **lines,
- char *pattern_list) {
+ char *pattern) {
char buffer[buffer_size];
matcher_t matcher;
- initialize_matcher(use_regexp, &matcher, pattern_list);
+ initialize_matcher(use_regexp, &matcher, pattern);
// We now take care of printing the lines per se
sprintf(buffer, "%d/%d pattern: %s%s",
nb_printed_lines,
nb_lines,
- pattern_list,
+ pattern,
use_regexp ? " [regexp]" : "");
for(int k = strlen(buffer); k < console_width; k++) buffer[k] = ' ';
strcpy(output_filename, "");
int i = 1;
- while(i < argc) {
+ int error = 0, show_help = 0;
+
+ while(!error && !show_help && i < argc) {
if(strcmp(argv[i], "-o") == 0) {
check_opt(argc, argv, i, 1, "<output filename>");
i++;
}
- else if(strcmp(argv[i], "-z") == 0) {
- zsh_history = 1;
+ else if(strcmp(argv[i], "-b") == 0) {
+ bash_history = 1;
i++;
}
- else if(strcmp(argv[i], "-b") == 0) {
- bash_history = 1;
+ else if(strcmp(argv[i], "-z") == 0) {
+ zsh_history = 1;
i++;
}
i += 5;
}
+ else if(strcmp(argv[i], "-h") == 0) {
+ show_help = 1;
+ i++;
+ }
+
else {
- cerr << "Selector version " << VERSION
- << endl
- << "Written by Francois Fleuret <francois@fleuret.org>"
- << endl
- << argv[0]
- << " [-h]"
- << " [-v]"
- << " [-m]"
- << " [-d]"
- << " [-e]"
- << " [-z]"
- << " [-i]"
- << " [-c <fg modeline> <bg modeline> <fg highlight> <bg highlight>]"
- << " [-o <output filename>]"
- << " [-s <pattern separator>]"
- << " [-l <max number of lines>]"
- << " -f <input filename>"
- << endl;
- if(strcmp(argv[i], "-h") == 0) {
- exit(0);
- } else {
- exit(1);
- }
+ cerr << "Unknown argument " << argv[i] << "." << endl;
+ error = 1;
}
}
+ if(show_help || error) {
+ cerr << "Selector version " << VERSION << "-R" << REVISION_NUMBER
+ << endl
+ << "Written by Francois Fleuret <francois@fleuret.org>."
+ << endl
+ << endl
+ << argv[0]
+ << " [-h]"
+ << " [-v]"
+ << " [-m]"
+ << " [-d]"
+ << " [-e]"
+ << " [-b]"
+ << " [-z]"
+ << " [-i]"
+ << " [-c <fg modeline> <bg modeline> <fg highlight> <bg highlight>]"
+ << " [-o <output filename>]"
+ << " [-s <pattern separator>]"
+ << " [-l <max number of lines>]"
+ << " -f <input filename>"
+ << endl;
+
+ exit(error);
+ }
+
char **lines = new char *[nb_lines_max];
if(!input_filename[0]) {
}
}
- char patterns[buffer_size];
- patterns[0] = '\0';
- int patterns_point;
- patterns_point = 0;
+ char pattern[buffer_size];
+ pattern[0] = '\0';
+ int pattern_point;
+ pattern_point = 0;
initscr();
int key;
int current_line = 0, temporary_line = 0;
- update_screen(¤t_line, &temporary_line, 0, nb_lines, lines, patterns);
+ update_screen(¤t_line, &temporary_line, 0, nb_lines, lines, pattern);
do {
int motion = 0;
if(key >= ' ' && key <= '~') {
- patterns[patterns_point++] = key;
- patterns[patterns_point] = '\0';
+ pattern[pattern_point++] = key;
+ pattern[pattern_point] = '\0';
}
else if(key == KEY_BACKSPACE || key == '\b' || key == '\7f' ||
key == KEY_DC || key == '\ 4') {
- if(patterns_point > 0) {
- patterns_point--;
- patterns[patterns_point] = '\0';
+ if(pattern_point > 0) {
+ pattern_point--;
+ pattern[pattern_point] = '\0';
}
}
motion = -10;
}
+ else if(key == KEY_DOWN || key == '\ e') {
+ motion = 1;
+ }
+
else if(key == KEY_UP || key == '\10') {
motion = -1;
}
use_regexp = !use_regexp;
}
- else if(key == KEY_DOWN || key == '\ e') {
- motion = 1;
+ else if(key == '\15') {
+ pattern_point = 0;
+ pattern[pattern_point] = '\0';
}
update_screen(¤t_line, &temporary_line, motion,
- nb_lines, lines, patterns);
+ nb_lines, lines, pattern);
} while(key != '\n' && key != KEY_ENTER && key != '\a');