-void build_display(char **choices, char *regexp) {
- clear(); // Cleaning the window
- refresh(); // After doing something on the display, we refresh it
- for(int y = 0; y < 10; y++) {
- printw("y = %d\n", y);
+const int buffer_size = 1024;
+const int nb_lines_max = 100000;
+
+void build_display(int *screen_line, int *line, int nb_lines, char **lines, char *regexp) {
+ char buffer[buffer_size];
+
+ int maxx = getmaxx(stdscr);
+ int maxy = min(buffer_size-2, getmaxy(stdscr));
+
+ // clear(); // Cleaning the window
+
+ use_default_colors();
+
+ printw("\n");
+
+ int nb_printed_lines = 1, last_printer_line = -1;
+ int y = 0;
+
+ while(nb_printed_lines < maxy && y < nb_lines) {
+ if(strstr(lines[y], regexp) &&
+ (last_printer_line < 0 || strcmp(lines[y], lines[last_printer_line]))) {
+ int k = 0;
+
+ while(lines[y][k] && k < buffer_size - 2 && k < maxx - 1) {
+ buffer[k] = lines[y][k];
+ k++;
+ }
+
+ while(k < maxx - 1) {
+ buffer[k++] = ' ';
+ }
+ buffer[k++] = '\n';
+ buffer[k++] = '\0';
+
+ if(nb_printed_lines == *line + 1) {
+ attron(COLOR_PAIR(2));
+ printw(buffer);
+ attroff(COLOR_PAIR(2));
+ } else {
+ printw(buffer);
+ }
+
+ last_printer_line = y;
+ nb_printed_lines++;
+ }
+ y++;
+ }
+
+ { // Erase the rest of the window. That's slightly ugly.
+ int k = 0;
+ while(k < maxx - 1) {
+ buffer[k++] = ' ';
+ }
+ buffer[k++] = '\n';
+ buffer[k++] = '\0';
+ for(int l = nb_printed_lines; l < maxy; l++) {
+ printw(buffer);
+ }