* selector is a simple command line utility for selection of strings
* with a dynamic pattern-matching.
*
- * Copyright (c) 2009 Francois Fleuret
+ * Copyright (c) 2009, 2010 Francois Fleuret
* Written by Francois Fleuret <francois@fleuret.org>
*
* This file is part of selector.
#include <termios.h>
#include <regex.h>
#include <locale.h>
+#include <getopt.h>
-#define VERSION "1.0"
+#define VERSION "1.1"
#define BUFFER_SIZE 4096
int result = 0;
char *s;
+ printf("string_to_positive_integer string=\"%s\"\n", string);
if(*string) {
- for(s = string; *s; s++) {
+ for(s = string; *s && *s != ','; s++) {
if(*s >= '0' && *s <= '9') {
result = result * 10 + (int) (*s - '0');
} else error = 1;
void print_help(FILE *out) {
- fprintf(out, "Selector version %s-R%s (%s)\n", VERSION, REVISION_NUMBER, UNAME);
+ fprintf(out, "Selector version %s (%s)\n", VERSION, UNAME);
fprintf(out, "Written by Francois Fleuret <francois@fleuret.org>.\n");
fprintf(out, "\n");
fprintf(out, "Usage: selector [options] [<filename1> [<filename2> ...]]\n");
/*********************************************************************/
+static struct option long_options[] = {
+ { "output-file", 1, 0, 'o' },
+ { "pattern-separator", 1, 0, 's' },
+ { "label-separator", 1, 0, 'x' },
+ { "inject-in-tty", no_argument, 0, 'v' },
+ { "add-control-qs", no_argument, 0, 'w' },
+ { "monochrome", no_argument, 0, 'm' },
+ { "no-beep", no_argument, 0, 'q' },
+ { "input-file", 1, 0, 'f' },
+ { "revert-order", no_argument, 0, 'i' },
+ { "remove-bash-prefix", no_argument, 0, 'b' },
+ { "remove-zsh-prefix", no_argument, 0, 'z' },
+ { "remove-duplicates", no_argument, 0, 'd' },
+ { "regexp", no_argument, 0, 'e' },
+ { "case-sensitive", no_argument, 0, 'a' },
+ { "title", 1, 0, 't' },
+ { "number-of-lines", 1, 0, 'l' },
+ { "colors", 1, 0, 'c' },
+ { "rest-are-files", no_argument, 0, '-' },
+ { "help", no_argument, 0, 'h' },
+ { 0, 0, 0, 0 }
+};
+
int main(int argc, char **argv) {
char input_filename[BUFFER_SIZE], output_filename[BUFFER_SIZE];
+ char c, *s;
char pattern[BUFFER_SIZE];
- int i, k, l, n;
+ int k, l, n;
int cursor_position;
int error = 0, show_help = 0;
int rest_are_files = 0;
strcpy(input_filename, "");
strcpy(output_filename, "");
- i = 1;
+ while (!rest_are_files &&
+ (c = getopt_long(argc, argv, "o:s:x:vwmqf:ibzdeat:l:c:-h",
+ long_options, NULL)) != -1) {
- while(!error && !show_help &&
- i < argc &&
- argv[i][0] == '-' && !rest_are_files) {
+ switch(c) {
- if(strcmp(argv[i], "-o") == 0) {
- check_opt(argc, argv, i, 1, "<output filename>");
- strncpy(output_filename, argv[i+1], BUFFER_SIZE);
- i += 2;
- }
+ case 'o':
+ strncpy(output_filename, optarg, BUFFER_SIZE);
+ break;
- else if(strcmp(argv[i], "-s") == 0) {
- check_opt(argc, argv, i, 1, "<pattern separator>");
- pattern_separator = argv[i+1][0];
- i += 2;
- }
+ case 's':
+ pattern_separator = optarg[0];
+ break;
- else if(strcmp(argv[i], "-x") == 0) {
- check_opt(argc, argv, i, 1, "<label separator>");
- label_separator = argv[i+1][0];
- i += 2;
- }
+ case 'x':
+ label_separator = optarg[0];
+ break;
- else if(strcmp(argv[i], "-v") == 0) {
+ case 'v':
output_to_vt_buffer = 1;
- i++;
- }
+ break;
- else if(strcmp(argv[i], "-w") == 0) {
+ case 'w':
add_control_qs = 1;
- i++;
- }
+ break;
- else if(strcmp(argv[i], "-m") == 0) {
+ case 'm':
with_colors = 0;
- i++;
- }
+ break;
- else if(strcmp(argv[i], "-q") == 0) {
+ case 'q':
error_flash = 1;
- i++;
- }
+ break;
- 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;
- }
+ case 'f':
+ strncpy(input_filename, optarg, BUFFER_SIZE);
+ break;
- else if(strcmp(argv[i], "-i") == 0) {
+ case 'i':
inverse_order = 1;
- i++;
- }
+ break;
- else if(strcmp(argv[i], "-b") == 0) {
+ case 'b':
bash_history = 1;
- i++;
- }
+ break;
- else if(strcmp(argv[i], "-z") == 0) {
+ case 'z':
zsh_history = 1;
- i++;
- }
+ break;
- else if(strcmp(argv[i], "-d") == 0) {
+ case 'd':
remove_duplicates = 1;
- i++;
- }
+ break;
- else if(strcmp(argv[i], "-e") == 0) {
+ case 'e':
use_regexp = 1;
- i++;
- }
+ break;
- else if(strcmp(argv[i], "-a") == 0) {
+ case 'a':
case_sensitive = 1;
- i++;
- }
+ break;
- else if(strcmp(argv[i], "-t") == 0) {
- check_opt(argc, argv, i, 1, "<title>");
+ case 't':
free(title);
- title = safe_malloc((strlen(argv[i+1]) + 1) * sizeof(char));
- 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) {
+ title = safe_malloc((strlen(optarg) + 1) * sizeof(char));
+ strcpy(title, optarg);
+ break;
+
+ case 'l':
+ nb_lines_max = string_to_positive_integer(optarg);
+ break;
+
+ case 'c':
+ s = optarg;
+ color_fg_modeline = string_to_positive_integer(s);
+ while(*s && *s != ',') s++; if(*s == ',') { s++; }
+ color_bg_modeline = string_to_positive_integer(s);
+ while(*s && *s != ',') s++; if(*s == ',') { s++; }
+ color_fg_highlight = string_to_positive_integer(s);
+ while(*s && *s != ',') s++; if(*s == ',') { s++; }
+ color_bg_highlight = string_to_positive_integer(s);
+ break;
+
+ case '-':
rest_are_files = 1;
- i++;
- }
+ break;
- else if(strcmp(argv[i], "-h") == 0) {
+ case 'h':
show_help = 1;
- i++;
- }
+ break;
- else {
- fprintf(stderr, "Selector: Unknown option %s.\n", argv[i]);
+ default:
error = 1;
+ break;
}
}
nb_lines_max, &nb_lines, lines);
}
- while(i < argc) {
+ while(optind < argc) {
read_file(hash_table,
- argv[i],
+ argv[optind],
nb_lines_max, &nb_lines, lines);
- i++;
+ optind++;
}
if(hash_table) {
nb_lines = n;
if(inverse_order) {
- for(i = 0; i < nb_lines / 2; i++) {
- char *s = lines[nb_lines - 1 - i];
- lines[nb_lines - 1 - i] = lines[i];
- lines[i] = s;
+ for(l = 0; l < nb_lines / 2; l++) {
+ char *s = lines[nb_lines - 1 - l];
+ lines[nb_lines - 1 - l] = lines[l];
+ lines[l] = s;
}
}