From: Francois Fleuret Date: Fri, 10 Feb 2012 10:16:45 +0000 (+0100) Subject: The sub-string highlighting seems to work. X-Git-Url: https://fleuret.org/cgi-bin/gitweb/gitweb.cgi?a=commitdiff_plain;h=f18a4423d8eb4fe2d3afb792ac5dbadfbc30bd74;p=selector.git The sub-string highlighting seems to work. --- diff --git a/selector.c b/selector.c index ff75c7a..a4d9ee5 100644 --- a/selector.c +++ b/selector.c @@ -326,6 +326,8 @@ struct matcher { int add_interval(int n, int *switches, int start, int end) { int f, g, k; + if(start == end) { return n; } + f = 0; while(f < n && switches[f] <= start) { f++; } g = f; @@ -339,24 +341,18 @@ int add_interval(int n, int *switches, int start, int end) { return n + 2; } - if(f%2) { - - if(f == g) { - /* switches[f-1] start end switches[f] */ - /* |XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX| */ - return n; - } + if(f % 2) { - if(g%2) { + if(g % 2) { /* switches[f-1] start switches[f] switches[g-1] end switches[g] */ /* |XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX| ... |XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX| */ - for(k = f; k < n; k++) { switches[k] = switches[(k - f) + g]; } + for(k = f; k < n; k++) { switches[k] = switches[k + (g - f)]; } return n - (g - f); } else { /* switches[f-1] start switches[f] switches[g-1] end switches[g] */ /* |XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX| ... XXXXXXXXXXXX| |XXXXXXXXXX */ switches[g - 1] = end; - for(k = f; k < n; k++) { switches[k] = switches[(k - f) + (g - 1)]; } + for(k = f; k < n; k++) { switches[k] = switches[k + ((g - 1) - f)]; } return n - ((g - 1) - f); } @@ -365,7 +361,7 @@ int add_interval(int n, int *switches, int start, int end) { if(f == g) { /* switches[f-1] start end switches[f] */ /* XXXXXXXXXXXX| |XXXXXXXXXX */ - for(k = n; k >= f; k--) { + for(k = n - 1; k >= f; k--) { switches[k + 2] = switches[k]; } switches[f] = start; @@ -373,18 +369,18 @@ int add_interval(int n, int *switches, int start, int end) { return n + 2; } - if(g%2) { + if(g % 2) { /* switches[f-1] start switches[f] switches[g-1] end switches[g] */ /* XXXXXXXXXXXX| |XXXXXXXXXX ... |XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX| */ switches[f] = start; - for(k = f + 1; k < n; k++) { switches[k] = switches[(k - (f + 1)) + g]; } + for(k = f + 1; k < n; k++) { switches[k] = switches[k + (g - (f + 1))]; } return n - (g - (f + 1)); } else { /* switches[f-1] start switches[f] switches[g-1] end switches[g] */ /* XXXXXXXXXXXX| |XXXXXXXXXX ... XXXXXXXXXXXX| |XXXXXXXXXX */ switches[f] = start; switches[g - 1] = end; - for(k = f + 1; k < n; k++) { switches[k] = switches[(k - (f + 1)) + (g - 1)]; } + for(k = f + 1; k < n; k++) { switches[k] = switches[k + ((g - 1) - (f + 1))]; } return n - ((g - 1) - (f + 1)); } } @@ -413,6 +409,24 @@ int match(struct matcher *matcher, char *string, int *nb_switches, int *switches *nb_switches = add_interval(*nb_switches, switches, (int) (where - string), (int) (where - string) + strlen(matcher->patterns[n])); + #warning CHECK THE INTERVALS + { + int k, i; + FILE *out = fopen("/tmp/intervals", "w"); + for(k = 0; k < (*nb_switches)/2; k++) { + i = 0; + for(; i < switches[2 * k]; i++) fprintf(out, "-"); + for(; i < switches[2 * k + 1]; i++) fprintf(out, "%c", string[i]); + for(; i < strlen(string); i++) fprintf(out, "-"); + fprintf(out, "\n"); + } + fclose(out); + for(k = 0; k < *nb_switches - 1; k++) { + if(switches[k] > switches[k+1]) { + abort(); + } + } + } } } } @@ -570,12 +584,12 @@ void print_string_with_switches(char *buffer, int line_width, if(switches[2 * w] < switches[2 * w + 1]) { next = switches[2 * w]; if(next > line_width) { next = line_width; } - addnstr(buffer + current, next - current); + if(next > current) { addnstr(buffer + current, next - current); } attron(attr_hits); current = next; next = switches[2 * w + 1]; if(next > line_width) { next = line_width; } - addnstr(buffer + current, next - current); + if(next > current) { addnstr(buffer + current, next - current); } attroff(attr_hits); current = next; } @@ -741,7 +755,7 @@ void update_screen(int *current_focus_line, int *displayed_focus_line, } attron(attr_focus_line); print_string_with_switches(buffer, k, console_width, - nb_switches, switches); + nb_switches / 2, switches); attroff(attr_focus_line); } else { if(show_long_lines && k >= console_width) { @@ -756,7 +770,7 @@ void update_screen(int *current_focus_line, int *displayed_focus_line, buffer[k++] = '\0'; } print_string_with_switches(buffer, k, console_width, - nb_switches, switches); + nb_switches / 2, switches); } nb_printed_lines++;