Rewrote the parsing of the color parameters.
authorFrancois Fleuret <francois@fleuret.org>
Sat, 17 Apr 2010 04:46:18 +0000 (06:46 +0200)
committerFrancois Fleuret <francois@fleuret.org>
Sat, 17 Apr 2010 04:46:18 +0000 (06:46 +0200)
selector.c

index e3c0b33..1b18ba3 100644 (file)
@@ -44,7 +44,7 @@
 #include <locale.h>
 #include <getopt.h>
 
-#define VERSION "1.1"
+#define VERSION "1.1.1"
 
 #define BUFFER_SIZE 4096
 
@@ -104,35 +104,52 @@ void inject_into_tty_buffer(char *string, int add_control_qs) {
 
 /*********************************************************************/
 
-void check_opt(int argc, char **argv, int n_opt, int n, const char *help) {
-  if(n_opt + n >= argc) {
-    fprintf(stderr, "Selector: Missing argument for %s, expecting %s.\n",
-            argv[n_opt], help);
-    exit(EXIT_FAILURE);
-  }
-}
-
-int string_to_positive_integer(char *string) {
-  int error = 0;
-  int result = 0;
+void str_to_positive_integers(char *string, int *values, int nb) {
+  int current_value, gotone;
   char *s;
+  int n;
 
-  if(*string) {
-    for(s = string; *s && *s != ','; s++) {
-      if(*s >= '0' && *s <= '9') {
-        result = result * 10 + (int) (*s - '0');
-      } else error = 1;
+  n = 0;
+  current_value = 0;
+  gotone = 0;
+  s = string;
+
+  while(1) {
+    if(*s >= '0' && *s <= '9') {
+      current_value = current_value * 10 + (int) (*s - '0');
+      gotone = 1;
+    } else if(*s == ',' || *s == '\0') {
+      if(gotone) {
+        if(n < nb) {
+          values[n++] = current_value;
+          if(*s == '\0') {
+            if(n == nb) {
+              return;
+            } else {
+              fprintf(stderr,
+                      "Selector: Missing value in `%s'.\n", string);
+              exit(EXIT_FAILURE);
+            }
+          }
+          current_value = 0;
+          gotone = 0;
+        } else {
+          fprintf(stderr,
+                  "Selector: Too many values in `%s'.\n", string);
+          exit(EXIT_FAILURE);
+        }
+      } else {
+        fprintf(stderr,
+                "Selector: Empty integer value in `%s'.\n", string);
+        exit(EXIT_FAILURE);
+      }
+    } else {
+      fprintf(stderr,
+              "Selector: Syntax error in `%s'.\n", string);
+      exit(EXIT_FAILURE);
     }
-  } else error = 1;
-
-  if(error) {
-    fprintf(stderr,
-            "Selector: Value `%s' is not a positive integer.\n",
-            string);
-    exit(EXIT_FAILURE);
+    s++;
   }
-
-  return result;
 }
 
 void error_feedback() {
@@ -505,8 +522,8 @@ void update_screen(int *current_focus_line, int *displayed_focus_line,
       int first_line = new_focus_line, last_line = new_focus_line;
       int nb_match = 1;
 
-      /* We find the first and last line to show, so that the total of
-         visible lines between them (them included) is
+      /* We find the first and last lines to show, so that the total
+         of visible lines between them (them included) is
          console_height-1 */
 
       while(nb_match < console_height-1 &&
@@ -801,7 +818,6 @@ static struct option long_options[] = {
 int main(int argc, char **argv) {
 
   char output_filename[BUFFER_SIZE];
-  char *s;
   char pattern[BUFFER_SIZE];
   int c, k, l, n;
   int cursor_position;
@@ -810,6 +826,7 @@ int main(int argc, char **argv) {
   int key;
   int current_focus_line, displayed_focus_line;
 
+  int colors[4];
   int color_fg_modeline, color_bg_modeline;
   int color_fg_highlight, color_bg_highlight;
 
@@ -896,18 +913,15 @@ int main(int argc, char **argv) {
       break;
 
     case 'l':
-      nb_lines_max = string_to_positive_integer(optarg);
+      str_to_positive_integers(optarg, &nb_lines_max, 1);
       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);
+      str_to_positive_integers(optarg, colors, 4);
+      color_fg_modeline = colors[0];
+      color_bg_modeline = colors[1];
+      color_fg_highlight = colors[2];
+      color_bg_highlight = colors[3];
       break;
 
     case '-':