Added a routine, now commented out, to remove all duplicates (not only
[selector.git] / selector.cc
index 56e6a23..e119fc6 100644 (file)
@@ -48,12 +48,13 @@ const int buffer_size = 1024;
 
 // Yeah, global variables!
 
-int nb_lines_max = 10000;
+int nb_lines_max = 1000;
 char pattern_separator = ';';
 int output_to_vt_buffer = 0;
 int with_colors = 1;
 int zsh_history = 0, bash_history = 0;
 int inverse_order = 0;
+int remove_duplicates = 0;
 
 //////////////////////////////////////////////////////////////////////
 
@@ -126,8 +127,7 @@ int next_visible(int current_line, int nb_lines, char **lines, int nb_patterns,
 
 void update_screen(int *current_line, int *temporary_line, int motion,
                    int nb_lines, char **lines,
-                   char *pattern_list,
-                   int no_blink) {
+                   char *pattern_list) {
 
   char buffer[buffer_size];
 
@@ -197,9 +197,7 @@ void update_screen(int *current_line, int *temporary_line, int motion,
     }
   }
 
-  if(!no_blink) {
-    clear();
-  }
+  clear();
 
   use_default_colors();
 
@@ -254,7 +252,7 @@ void update_screen(int *current_line, int *temporary_line, int motion,
         // We fill the rest of the line with blanks if either we did
         // not clear() or if this is the highlighted line
 
-        if(no_blink || l == new_line) {
+        if(l == new_line) {
           while(k < console_width) {
             buffer[k++] = ' ';
           }
@@ -295,18 +293,6 @@ void update_screen(int *current_line, int *temporary_line, int motion,
     nb_printed_lines++;
   }
 
-  if(no_blink) { // Erase the rest of the window. That's slightly ugly.
-    int k = 0;
-    while(k < console_width) {
-      buffer[k++] = ' ';
-    }
-    buffer[k++] = '\n';
-    buffer[k++] = '\0';
-    for(int l = nb_printed_lines; l < console_height; l++) {
-      addnstr(buffer, console_width);
-    }
-  }
-
   // Draw the modeline
 
   sprintf(buffer, "%d/%d pattern: %s",
@@ -337,8 +323,6 @@ void update_screen(int *current_line, int *temporary_line, int motion,
 
 int main(int argc, char **argv) {
   char buffer[buffer_size];
-  char *lines[nb_lines_max];
-  int no_blink = 0;
   int color_fg_modeline, color_bg_modeline;
   int color_fg_highlight, color_bg_highlight;
 
@@ -385,11 +369,6 @@ int main(int argc, char **argv) {
       i += 2;
     }
 
-    // else if(strcmp(argv[i], "-b") == 0) {
-    // no_blink = 1;
-    // i++;
-    // }
-
     else if(strcmp(argv[i], "-i") == 0) {
       inverse_order = 1;
       i++;
@@ -405,6 +384,11 @@ int main(int argc, char **argv) {
       i++;
     }
 
+    else if(strcmp(argv[i], "-r") == 0) {
+      remove_duplicates = 1;
+      i++;
+    }
+
     else if(strcmp(argv[i], "-l") == 0) {
       check_opt(argc, argv, i, 1, "<maximum number of lines>");
       nb_lines_max = atoi(argv[i+1]);
@@ -429,6 +413,7 @@ int main(int argc, char **argv) {
            << " [-h]"
            << " [-v]"
            << " [-m]"
+           << " [-r]"
            << " [-z]"
            << " [-i]"
            << " [-c <fg modeline> <bg modeline> <fg highlight> <bg highlight>]"
@@ -445,6 +430,8 @@ int main(int argc, char **argv) {
     }
   }
 
+  char **lines = new char *[nb_lines_max];
+
   if(!input_filename[0]) {
     cerr << "You must specify a input file with -f." << endl;
     exit(1);
@@ -472,9 +459,33 @@ int main(int argc, char **argv) {
         while(*s == ' ' || (*s >= '0' && *s <= '9')) s++;
       }
 
-      lines[nb_lines] = new char[strlen(s) + 1];
-      strcpy(lines[nb_lines], s);
-      nb_lines++;
+      /*
+
+      // This is supposed to remove any duplicates, not only
+      // successive ones. However, it is O(N^2), we should use
+      // hash-codes
+
+      int keep = 1;
+
+      if(remove_duplicates) {
+        for(int k = 0; keep && k < nb_lines; k++) {
+          keep &= strcmp(lines[k], s);
+        }
+      }
+
+      if(keep) {
+        lines[nb_lines] = new char[strlen(s) + 1];
+        strcpy(lines[nb_lines], s);
+        nb_lines++;
+      }
+
+      */
+
+      if(!remove_duplicates || nb_lines == 0 || strcmp(lines[nb_lines - 1], s)) {
+        lines[nb_lines] = new char[strlen(s) + 1];
+        strcpy(lines[nb_lines], s);
+        nb_lines++;
+      }
     }
   }
 
@@ -520,7 +531,7 @@ int main(int argc, char **argv) {
   int key;
   int current_line = 0, temporary_line = 0;
 
-  update_screen(&current_line, &temporary_line, 0, nb_lines, lines, patterns, no_blink);
+  update_screen(&current_line, &temporary_line, 0, nb_lines, lines, patterns);
 
   do {
 
@@ -533,7 +544,8 @@ int main(int argc, char **argv) {
       patterns[patterns_point] = '\0';
     }
 
-    else if(key == KEY_BACKSPACE || key == KEY_DC || key == '\b') {
+    else if(key == KEY_BACKSPACE || key == '\b' ||
+            key == KEY_DC || key == '\ 4') {
       if(patterns_point > 0) {
         patterns_point--;
         patterns[patterns_point] = '\0';
@@ -565,7 +577,7 @@ int main(int argc, char **argv) {
     }
 
     update_screen(&current_line, &temporary_line, motion,
-                  nb_lines, lines, patterns, no_blink);
+                  nb_lines, lines, patterns);
 
   } while(key != '\n' && key != KEY_ENTER && key != '\a');
 
@@ -574,6 +586,7 @@ int main(int argc, char **argv) {
   endwin();
 
   if((key == KEY_ENTER || key == '\n')) {
+
     if(output_to_vt_buffer) {
       if(temporary_line >= 0 && temporary_line < nb_lines) {
         inject_into_tty_buffer(lines[temporary_line]);
@@ -594,11 +607,13 @@ int main(int argc, char **argv) {
       }
       out.flush();
     }
+
   }
 
   for(int l = 0; l < nb_lines; l++) {
     delete[] lines[l];
   }
+  delete[] lines;
 
   exit(0);
 }