--- diff.c | 48 ++++++++++++++++++++---------------------------- 1 file changed, 20 insertions(+), 28 deletions(-) diff --git a/diff.c b/diff.c index 21f9849..b6da7b9 100644 --- a/diff.c +++ b/diff.c _AT_@ -4,6 +4,7 @@ #include <stdlib.h> #include <string.h> #include <unistd.h> +#include <stdint.h> #include "util.h" _AT_@ -22,9 +23,6 @@ struct output { char* text; }; -static struct output *red = 0; -static struct output *green = 0; - static struct file_data * load_lines(const char *pathname) { _AT_@ -87,14 +85,14 @@ load_lines(const char *pathname) static char * diff2(char **a, char **b, size_t an, size_t bn) { - size_t **matrix = emalloc((an + 1) * sizeof(size_t *) + (an + 1) * (bn + 1) * sizeof(size_t)); - char **map = emalloc((an + 1) * sizeof(char *) + (an + 1) * (bn + 1) * sizeof(char)); - size_t ai, bi, ri = 0; + size_t **matrix = emalloc((an + 2) * sizeof(size_t *) + (an + 2) * (bn + 1) * sizeof(size_t)); + char **map = emalloc((an + 2) * sizeof(char *) + (an + 2) * (bn + 1) * sizeof(char)); + size_t ai, bi, ri = 0, boff = 1; char *rc; - for (ai = 0; ai <= an; ai++) { - matrix[ai] = (size_t *)(matrix + an + 1) + ai * (bn + 1); - map [ai] = (char *)(map + an + 1) + ai * (bn + 1); + for (ai = 0; ai <= an + 1; ai++) { + matrix[ai] = (size_t *)(matrix + an + 2) + ai * (bn + 1); + map [ai] = (char *)(map + an + 2) + ai * (bn + 1); matrix[ai][0] = ai; map [ai][0] = 1; } _AT_@ -107,14 +105,18 @@ diff2(char **a, char **b, size_t an, size_t bn) a--, b--; for (ai = 1; ai <= an; ai++) { - for (bi = 1; bi <= bn; bi++) { + for (bi = boff; bi <= bn; bi++) { size_t d = matrix[ai - 1][bi - 1]; size_t u = matrix[ai - 1][bi ]; size_t l = matrix[ai ][bi - 1]; size_t lu = 1 + (l < u ? l : u); int ch = strcmp(a[ai], b[bi]); /* remember !! if using d += ch */ - matrix[ai][bi] = (lu < d || ch) ? lu : d; map [ai][bi] = (lu < d || ch) ? 1 + (l < u) : 0; + matrix[ai][bi] = (lu < d || ch) ? lu : d; + if (matrix[ai][bi] < matrix[ai][boff]) { + boff = bi - 1; + matrix[ai + 1][boff - 1] = SSIZE_MAX; /* sic! */ + } } } _AT_@ -134,28 +136,20 @@ diff2(char **a, char **b, size_t an, size_t bn) static void flush_output(struct output *output, size_t n) { + size_t i; + if (!n) return; if (output->colour == 0) { printf("%s%s\n", " ", output->text); } else { - size_t colour_n[] = { [1] = 0, [2] = 0 }, i; - static size_t last_size = 0; - - if (last_size < n) { - red = erealloc(red, n * sizeof(*red)); - green = erealloc(green, n * sizeof(*green)); - last_size = n; - } - for (i = 0; i < n; i++) - (output[i].colour == 1 ? red : green)[colour_n[(int)(output[i].colour)]++] = output[i]; - - for (i = 0, n = colour_n[1]; i < n; i++) - printf("\033[31m-%s\033[m\n", red[i].text); - for (i = 0, n = colour_n[2]; i < n; i++) - printf("\033[32m+%s\033[m\n", green[i].text); + if (output[i].colour == 1) + printf("\033[31m-%s\033[m\n", output[i].text); + for (i = 0; i < n; i++) + if (output[i].colour == 2) + printf("\033[32m+%s\033[m\n", output[i].text); } } _AT_@ -197,8 +191,6 @@ main(int argc, char *argv[]) if (fshut(stdout, "<stdout>")) ret = 2; - free(red); - free(green); free(old); free(new); free(path); -- 2.7.0Received on Wed Jan 27 2016 - 22:45:49 CET
This archive was generated by hypermail 2.3.0 : Wed Jan 27 2016 - 22:48:18 CET