Now uses getopt_long to parse the arguments.
authorFrancois Fleuret <francois@fleuret.org>
Tue, 13 Apr 2010 16:25:25 +0000 (18:25 +0200)
committerFrancois Fleuret <francois@fleuret.org>
Tue, 13 Apr 2010 16:25:25 +0000 (18:25 +0200)
selector.1
selector.c

index 6663558..31f3832 100644 (file)
@@ -59,63 +59,64 @@ case-insensitive modes.
 
 .SH "OPTIONS"
 .TP
 
 .SH "OPTIONS"
 .TP
-\fB-h\fR
+\fB-h\fR, \fB--help\fR
 display help and exit
 .TP
 display help and exit
 .TP
-\fB-m\fR
+\fB-m\fR, \fB--monochrome\fR
 force the monochrome mode
 .TP
 force the monochrome mode
 .TP
-\fB-i\fR
+\fB-i\fR, \fB--revert-order\fR
 revert the order of the lines
 .TP
 revert the order of the lines
 .TP
-\fB-b\fR
+\fB-b\fR, \fB--remove-bash-prefix\fR
 remove the numeric prefix from bash history
 .TP
 remove the numeric prefix from bash history
 .TP
-\fB-z\fR
+\fB-z\fR, \fB--remove-zsh-prefix\fR
 remove the time prefix from zsh history
 .TP
 remove the time prefix from zsh history
 .TP
-\fB-d\fR
+\fB-d\fR, \fB--remove-duplicates\fR
 remove duplicated lines (note that you can have two different lines
 with the same visible part if you use the -x option)
 .TP
 remove duplicated lines (note that you can have two different lines
 with the same visible part if you use the -x option)
 .TP
-\fB-e\fR
+\fB-e\fR, \fB--regexp\fR
 start in regexp mode
 .TP
 start in regexp mode
 .TP
-\fB-a\fR
+\fB-a\fR, \fB--case-sensitive\fR
 start in case sensitive mode
 .TP
 start in case sensitive mode
 .TP
-\fB-q\fR
+\fB-q\fR, \fB--no-beep\fR
 make a flash instead of a beep when there is an edition error
 .TP
 make a flash instead of a beep when there is an edition error
 .TP
-\fB--\fR
+\fB--\fR, \fB--rest-are-files\fR
 state that all following arguments are filenames
 .TP
 state that all following arguments are filenames
 .TP
-\fB-t \fI<title>\fR
+\fB-t \fI<title>\fR, \fB--title \fI<title>\fR
 add a title in the modeline
 .TP
 add a title in the modeline
 .TP
-\fB-c \fI<fg_modeline> <bg_modeline> <fg_highlight> <bg_highlight>\fR
+\fB-c \fI<fg_modeline>,<bg_modeline>,<fg_highlight>,<bg_highlight>\fR,
+\fB--colors \fI<fg_modeline>,<bg_modeline>,<fg_highlight>,<bg_highlight>\fR
 select the modeline and highlight color numbers
 .TP
 select the modeline and highlight color numbers
 .TP
-\fB-v\fR
+\fB-v\fR, \fB--inject-in-tty\fR
 inject the selected line into the tty input buffer
 .TP
 inject the selected line into the tty input buffer
 .TP
-\fB-w\fR
+\fB-w\fR, \fB--add-control-qs\fR
 add ^Q between characters during tty injection to quote control characters
 .TP
 add ^Q between characters during tty injection to quote control characters
 .TP
-\fB-o \fI<output_filename>\fR
+\fB-o \fI<output_filename>\fR, \fB--output-file \fI<output_filename>\fR
 write the selected line into the specified file
 .TP
 write the selected line into the specified file
 .TP
-\fB-s \fI<pattern_separator>\fR
+\fB-s \fI<pattern_separator>\fR, \fB--pattern-separator \fI<pattern_separator>\fR
 specify the symbol to separate the substrings in the search pattern
 .TP
 specify the symbol to separate the substrings in the search pattern
 .TP
-\fB-x \fI<label_separator>\fR
+\fB-x \fI<label_separator>\fR, \fB--label-separator \fI<label_separator>\fR
 specify the symbol to separate what to show to the user during the
 selection from the line to return
 .TP
 specify the symbol to separate what to show to the user during the
 selection from the line to return
 .TP
-\fB-l \fI<max_number_of_lines>\fR
+\fB-l \fI<max_number_of_lines>\fR, \fB--number-of-lines \fI<max_number_of_lines>\fR
 specify the maximum number of lines to take into account
 .TP
 specify the maximum number of lines to take into account
 .TP
-\fB-f \fI<input_filename>\fR
+\fB-f \fI<input_filename>\fR, \fB--input-file \fI<input_filename>\fR
 specify a file to search into (option kept for compatibility reasons)
 
 .SH "EXAMPLES"
 specify a file to search into (option kept for compatibility reasons)
 
 .SH "EXAMPLES"
index 5c9d85f..5054f6b 100644 (file)
@@ -42,6 +42,7 @@
 #include <termios.h>
 #include <regex.h>
 #include <locale.h>
 #include <termios.h>
 #include <regex.h>
 #include <locale.h>
+#include <getopt.h>
 
 #define VERSION "1.0.1"
 
 
 #define VERSION "1.0.1"
 
@@ -116,8 +117,9 @@ int string_to_positive_integer(char *string) {
   int result = 0;
   char *s;
 
   int result = 0;
   char *s;
 
+  printf("string_to_positive_integer string=\"%s\"\n", string);
   if(*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;
       if(*s >= '0' && *s <= '9') {
         result = result * 10 + (int) (*s - '0');
       } else error = 1;
@@ -775,11 +777,35 @@ void read_file(struct hash_table_t *hash_table,
 
 /*********************************************************************/
 
 
 /*********************************************************************/
 
+static struct option long_options[] = {
+  { "output-file", 1, 0, 'o' },
+  { "separator-patterns", 1, 0, 's' },
+  { "separator-display", 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];
 int main(int argc, char **argv) {
 
   char input_filename[BUFFER_SIZE], output_filename[BUFFER_SIZE];
+  char c, *s;
   char pattern[BUFFER_SIZE];
   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;
   int cursor_position;
   int error = 0, show_help = 0;
   int rest_are_files = 0;
@@ -808,123 +834,100 @@ int main(int argc, char **argv) {
   strcpy(input_filename, "");
   strcpy(output_filename, "");
 
   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;
       output_to_vt_buffer = 1;
-      i++;
-    }
+      break;
 
 
-    else if(strcmp(argv[i], "-w") == 0) {
+    case 'w':
       add_control_qs = 1;
       add_control_qs = 1;
-      i++;
-    }
+      break;
 
 
-    else if(strcmp(argv[i], "-m") == 0) {
+    case 'm':
       with_colors = 0;
       with_colors = 0;
-      i++;
-    }
+      break;
 
 
-    else if(strcmp(argv[i], "-q") == 0) {
+    case 'q':
       error_flash = 1;
       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;
       inverse_order = 1;
-      i++;
-    }
+      break;
 
 
-    else if(strcmp(argv[i], "-b") == 0) {
+    case 'b':
       bash_history = 1;
       bash_history = 1;
-      i++;
-    }
+      break;
 
 
-    else if(strcmp(argv[i], "-z") == 0) {
+    case 'z':
       zsh_history = 1;
       zsh_history = 1;
-      i++;
-    }
+      break;
 
 
-    else if(strcmp(argv[i], "-d") == 0) {
+    case 'd':
       remove_duplicates = 1;
       remove_duplicates = 1;
-      i++;
-    }
+      break;
 
 
-    else if(strcmp(argv[i], "-e") == 0) {
+    case 'e':
       use_regexp = 1;
       use_regexp = 1;
-      i++;
-    }
+      break;
 
 
-    else if(strcmp(argv[i], "-a") == 0) {
+    case 'a':
       case_sensitive = 1;
       case_sensitive = 1;
-      i++;
-    }
+      break;
 
 
-    else if(strcmp(argv[i], "-t") == 0) {
-      check_opt(argc, argv, i, 1, "<title>");
+    case 't':
       free(title);
       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;
       rest_are_files = 1;
-      i++;
-    }
+      break;
 
 
-    else if(strcmp(argv[i], "-h") == 0) {
+    case 'h':
       show_help = 1;
       show_help = 1;
-      i++;
-    }
+      break;
 
 
-    else {
-      fprintf(stderr, "Selector: Unknown option %s.\n", argv[i]);
+    default:
       error = 1;
       error = 1;
+      break;
     }
   }
 
     }
   }
 
@@ -954,11 +957,11 @@ int main(int argc, char **argv) {
               nb_lines_max, &nb_lines, lines);
   }
 
               nb_lines_max, &nb_lines, lines);
   }
 
-  while(i < argc) {
+  while(optind < argc) {
     read_file(hash_table,
     read_file(hash_table,
-              argv[i],
+              argv[optind],
               nb_lines_max, &nb_lines, lines);
               nb_lines_max, &nb_lines, lines);
-    i++;
+    optind++;
   }
 
   if(hash_table) {
   }
 
   if(hash_table) {
@@ -977,10 +980,10 @@ int main(int argc, char **argv) {
   nb_lines = n;
 
   if(inverse_order) {
   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;
     }
   }
 
     }
   }