+ int color_fg_modeline, color_bg_modeline;
+ int color_fg_highlight, color_bg_highlight;
+
+ color_fg_modeline = COLOR_WHITE;
+ color_bg_modeline = COLOR_BLACK;
+ color_fg_highlight = COLOR_BLACK;
+ color_bg_highlight = COLOR_YELLOW;
+
+ setlocale(LC_ALL, "");
+
+ char input_filename[buffer_size], output_filename[buffer_size];
+
+ strcpy(input_filename, "");
+ strcpy(output_filename, "");
+
+ int i = 1;
+ int error = 0, show_help = 0;
+ int rest_are_files = 0;
+
+ while(!error && !show_help && i < argc && argv[i][0] == '-' && !rest_are_files) {
+
+ if(strcmp(argv[i], "-o") == 0) {
+ check_opt(argc, argv, i, 1, "<output filename>");
+ strncpy(output_filename, argv[i+1], buffer_size);
+ i += 2;
+ }
+
+ else if(strcmp(argv[i], "-s") == 0) {
+ check_opt(argc, argv, i, 1, "<pattern separator>");
+ pattern_separator = argv[i+1][0];
+ i += 2;
+ }
+
+ else if(strcmp(argv[i], "-x") == 0) {
+ check_opt(argc, argv, i, 1, "<label separator>");
+ label_separator = argv[i+1][0];
+ i += 2;
+ }
+
+ else if(strcmp(argv[i], "-v") == 0) {
+ output_to_vt_buffer = 1;
+ i++;
+ }
+
+ else if(strcmp(argv[i], "-w") == 0) {
+ add_control_qs = 1;
+ i++;
+ }
+
+ else if(strcmp(argv[i], "-m") == 0) {
+ with_colors = 0;
+ i++;
+ }
+
+ else if(strcmp(argv[i], "-q") == 0) {
+ error_flash = 1;
+ i++;
+ }
+
+ else if(strcmp(argv[i], "-f") == 0) {
+ check_opt(argc, argv, i, 1, "<input filename>");
+ strncpy(input_filename, argv[i+1], buffer_size);
+ i += 2;
+ }
+
+ else if(strcmp(argv[i], "-i") == 0) {
+ inverse_order = 1;
+ i++;
+ }
+
+ else if(strcmp(argv[i], "-b") == 0) {
+ bash_history = 1;
+ i++;
+ }
+
+ else if(strcmp(argv[i], "-z") == 0) {
+ zsh_history = 1;
+ i++;
+ }
+
+ else if(strcmp(argv[i], "-d") == 0) {
+ remove_duplicates = 1;
+ i++;
+ }
+
+ else if(strcmp(argv[i], "-e") == 0) {
+ use_regexp = 1;
+ i++;
+ }
+
+ else if(strcmp(argv[i], "-a") == 0) {
+ case_sensitive = 1;
+ i++;
+ }
+
+ else if(strcmp(argv[i], "-t") == 0) {
+ check_opt(argc, argv, i, 1, "<title>");
+ delete[] title;
+ title = new char[strlen(argv[i+1]) + 1];
+ strcpy(title, argv[i+1]);
+ i += 2;
+ }
+
+ else if(strcmp(argv[i], "-l") == 0) {
+ check_opt(argc, argv, i, 1, "<maximum number of lines>");
+ 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 = 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;
+ }
+
+ else if(strcmp(argv[i], "--") == 0) {
+ rest_are_files = 1;
+ i++;
+ }
+
+ else if(strcmp(argv[i], "-h") == 0) {
+ show_help = 1;
+ i++;
+ }
+
+ else {
+ fprintf(stderr, "Unknown option %s.\n", argv[i]);
+ error = 1;
+ }
+ }
+
+ if(show_help || error) {
+ fprintf(stderr, "Selector version %s-R%s\n", VERSION, REVISION_NUMBER);
+ fprintf(stderr, "Written by Francois Fleuret <francois@fleuret.org>.\n");
+ fprintf(stderr, "Usage: %s [options] [<filename1> [<filename2> ...]]\n", argv[0]);
+ fprintf(stderr, "\n");
+ fprintf(stderr, " -h show this help\n");
+ fprintf(stderr, " -v inject the selected line in the tty\n");
+ fprintf(stderr, " -w quote control characters with ^Qs when using -v\n");
+ fprintf(stderr, " -d remove duplicated lines\n");
+ fprintf(stderr, " -b remove the bash history line prefix\n");
+ fprintf(stderr, " -z remove the zsh history line prefix\n");
+ fprintf(stderr, " -i invert the order of lines\n");
+ fprintf(stderr, " -e start in regexp mode\n");
+ fprintf(stderr, " -a start in case sensitive mode\n");
+ fprintf(stderr, " -m monochrome mode\n");
+ fprintf(stderr, " -q make a flash instead of a beep on an edition error\n");
+ fprintf(stderr, " -- all following arguments are filenames\n");
+ fprintf(stderr, " -t <title>\n");
+ fprintf(stderr, " add a title in the modeline\n");
+ fprintf(stderr, " -c <fg modeline> <bg modeline> <fg highlight> <bg highlight>\n");
+ fprintf(stderr, " set the display colors\n");
+ fprintf(stderr, " -o <output filename>\n");
+ fprintf(stderr, " set a file to write the selected line to\n");
+ fprintf(stderr, " -s <pattern separator>\n");
+ fprintf(stderr, " set the symbol to separate substrings in the pattern\n");
+ fprintf(stderr, " -x <label separator>\n");
+ fprintf(stderr, " set the symbol to terminate the label\n");
+ fprintf(stderr, " -l <max number of lines>\n");
+ fprintf(stderr, " set the maximum number of lines to take into account\n");
+ fprintf(stderr, "\n");
+ exit(error);
+ }
+
+ char **lines = new char *[nb_lines_max];
+