X-Git-Url: https://fleuret.org/cgi-bin/gitweb/gitweb.cgi?a=blobdiff_plain;f=selector.c;h=81286d6b8f4307f32965095d707fb5e710b2716f;hb=98ebced475975d1dd0cb733d11e2413e8bb54c54;hp=ff75c7adc08875111c515d695f17c9eb6a5f6d77;hpb=ba39a532d21befe924af75cc5f9161a4cd793147;p=selector.git diff --git a/selector.c b/selector.c index ff75c7a..81286d6 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 % 2) { - if(f == g) { - /* switches[f-1] start end switches[f] */ - /* |XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX| */ - return n; - } - - 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)); } } @@ -393,6 +389,7 @@ int add_interval(int n, int *switches, int start, int end) { int match(struct matcher *matcher, char *string, int *nb_switches, int *switches) { int n; char *where; + regmatch_t matches; if(nb_switches) { *nb_switches = 0; } @@ -413,12 +410,39 @@ 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(); + } + } + } } } } return 1; } else { - return regexec(&matcher->preg, string, 0, 0, 0) == 0; + if(regexec(&matcher->preg, string, 1, &matches, 0) == 0) { + if(switches) { + *nb_switches = 2; + switches[0] = matches.rm_so; + switches[1] = matches.rm_eo; + } + return 1; + } else { + return 0; + } } } @@ -570,12 +594,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; } @@ -616,10 +640,10 @@ void update_screen(int *current_focus_line, int *displayed_focus_line, initialize_matcher(&matcher, use_regexp, case_sensitive, pattern); - if(show_hits && matcher.nb_patterns > 0) { + if(show_hits && matcher.nb_patterns >= 0) { switches = safe_malloc(sizeof(int) * matcher.nb_patterns * 2); } else { - switches = 0; + switches = safe_malloc(sizeof(int) * 2); } console_width = getmaxx(stdscr); @@ -741,7 +765,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) { @@ -755,8 +779,9 @@ void update_screen(int *current_focus_line, int *displayed_focus_line, buffer[k++] = '\n'; buffer[k++] = '\0'; } + print_string_with_switches(buffer, k, console_width, - nb_switches, switches); + nb_switches / 2, switches); } nb_printed_lines++;