Changed the handling of the argument errors and short help printing.
[selector.git] / selector.cc
index e21025f..d36c836 100644 (file)
@@ -104,8 +104,11 @@ int test_and_add(char *new_string, int new_index,
                  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;
@@ -398,7 +401,9 @@ int main(int argc, char **argv) {
   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>");
@@ -468,33 +473,40 @@ int main(int argc, char **argv) {
       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
+         << 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;
+
+    exit(error);
+  }
+
   char **lines = new char *[nb_lines_max];
 
   if(!input_filename[0]) {
@@ -629,6 +641,11 @@ int main(int argc, char **argv) {
       use_regexp = !use_regexp;
     }
 
+    else if(key == '\15') {
+      patterns_point = 0;
+      patterns[patterns_point] = '\0';
+    }
+
     else if(key == KEY_DOWN || key == '\ e') {
       motion = 1;
     }