Start counting nb_printed_lines from 0
[selector.git] / selector.cc
index 0062a3b..f4d7930 100644 (file)
@@ -48,41 +48,47 @@ 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;
+
+//////////////////////////////////////////////////////////////////////
+
+// int test_and_set_hash(char *s, char **hashed, int hash_size) {
+  // uint32_t code = 0, mask;
+  // int result;
+
+  // for(int k = 0; s[k]; k++) {
+    // code += ((uint32_t) (s[k])) << (8 * k%4);
+  // }
+
+  // code = code%hash_table_size;
+
+  // if(hashed[code]) {
+  // } else {
+  // }
+// }
 
 //////////////////////////////////////////////////////////////////////
 
 // This looks severely Linux-only ...
 
 void inject_into_tty_buffer(char *line) {
-  char *tty = ttyname(STDIN_FILENO);
-  int fd = open(tty, O_RDWR);
-
   struct termios oldtio, newtio;
-
-  if (fd >= 0) {
-    // Save current port settings
-    tcgetattr(fd,&oldtio);
-    memset(&newtio, 0, sizeof(newtio));
-    // Set input mode (non-canonical, *no echo*,...)
-    tcflush(fd, TCIFLUSH);
-    tcsetattr(fd,TCSANOW, &newtio);
-    // Put the selected line in the tty input buffer
-    for(char *k = line; *k; k++) {
-      ioctl(fd, TIOCSTI, k);
-    }
-    // Restore the old settings
-    tcsetattr(fd,TCSANOW, &oldtio);
-    close(fd);
-  } else {
-    cerr << "Can not open " << tty << "." << endl;
-    exit(1);
+  tcgetattr(STDIN_FILENO,&oldtio);
+  memset(&newtio, 0, sizeof(newtio));
+  // Set input mode (non-canonical, *no echo*,...)
+  tcsetattr(STDIN_FILENO,TCSANOW, &newtio);
+  // Put the selected line in the tty input buffer
+  for(char *k = line; *k; k++) {
+    ioctl(STDIN_FILENO, TIOCSTI, k);
   }
+  // Restore the old settings
+  tcsetattr(STDIN_FILENO,TCSANOW, &oldtio);
 }
 
 //////////////////////////////////////////////////////////////////////
@@ -202,7 +208,7 @@ void update_screen(int *current_line, int *temporary_line, int motion,
 
   addstr("\n");
 
-  int nb_printed_lines = 1;
+  int nb_printed_lines = 0;
 
   // Here new_line is either a line number matching the patterns, or -1
 
@@ -287,15 +293,14 @@ void update_screen(int *current_line, int *temporary_line, int motion,
 
   *temporary_line = new_line;
 
-  if(nb_printed_lines == 1) {
+  if(nb_printed_lines == 0) {
     addnstr("[no selection]\n", console_width);
-    nb_printed_lines++;
   }
 
   // Draw the modeline
 
   sprintf(buffer, "%d/%d pattern: %s",
-          nb_printed_lines - 1,
+          nb_printed_lines,
           nb_lines,
           pattern_list);
 
@@ -322,7 +327,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 color_fg_modeline, color_bg_modeline;
   int color_fg_highlight, color_bg_highlight;
 
@@ -384,6 +388,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]);
@@ -408,6 +417,7 @@ int main(int argc, char **argv) {
            << " [-h]"
            << " [-v]"
            << " [-m]"
+           << " [-r]"
            << " [-z]"
            << " [-i]"
            << " [-c <fg modeline> <bg modeline> <fg highlight> <bg highlight>]"
@@ -424,6 +434,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);
@@ -451,9 +463,11 @@ 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++;
+      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++;
+      }
     }
   }
 
@@ -512,7 +526,7 @@ int main(int argc, char **argv) {
       patterns[patterns_point] = '\0';
     }
 
-    else if(key == KEY_BACKSPACE || key == '\b' ||
+    else if(key == KEY_BACKSPACE || key == '\b' || key == '\7f' ||
             key == KEY_DC || key == '\ 4') {
       if(patterns_point > 0) {
         patterns_point--;
@@ -581,6 +595,7 @@ int main(int argc, char **argv) {
   for(int l = 0; l < nb_lines; l++) {
     delete[] lines[l];
   }
+  delete[] lines;
 
   exit(0);
 }