version 1.20, 2007/05/30 03:30:21 |
version 1.21, 2007/06/28 01:26:24 |
|
|
static void uni_range(int, int); |
static void uni_range(int, int); |
static void dump_context_vec(FILE *, FILE *, int); |
static void dump_context_vec(FILE *, FILE *, int); |
static void dump_unified_vec(FILE *, FILE *, int); |
static void dump_unified_vec(FILE *, FILE *, int); |
static int prepare(int, FILE *, off_t, int); |
static void prepare(int, FILE *, off_t, int); |
static void prune(void); |
static void prune(void); |
static void equiv(struct line *, int, struct line *, int, int *); |
static void equiv(struct line *, int, struct line *, int, int *); |
static void unravel(int); |
static void unravel(int); |
|
|
static int *member; /* will be overlaid on file[1] */ |
static int *member; /* will be overlaid on file[1] */ |
static int clen; |
static int clen; |
static int inifdef; /* whether or not we are in a #ifdef block */ |
static int inifdef; /* whether or not we are in a #ifdef block */ |
static int diff_len[2]; |
static int len[2]; |
static int pref, suff; /* length of prefix and suffix */ |
static int pref, suff; /* length of prefix and suffix */ |
static int slen[2]; |
static int slen[2]; |
static int anychange; |
static int anychange; |
|
|
goto closem; |
goto closem; |
} |
} |
|
|
if (prepare(0, f1, stb1.st_size, flags) < 0 || |
prepare(0, f1, stb1.st_size, flags); |
prepare(1, f2, stb2.st_size, flags) < 0) { |
prepare(1, f2, stb2.st_size, flags); |
goto closem; |
|
} |
|
|
|
prune(); |
prune(); |
sort(sfile[0], slen[0]); |
sort(sfile[0], slen[0]); |
|
|
xfree(member); |
xfree(member); |
xfree(class); |
xfree(class); |
|
|
J = xrealloc(J, diff_len[0] + 2, sizeof(*J)); |
J = xrealloc(J, len[0] + 2, sizeof(*J)); |
unravel(klist[i]); |
unravel(klist[i]); |
xfree(clist); |
xfree(clist); |
xfree(klist); |
xfree(klist); |
|
|
ixold = xrealloc(ixold, diff_len[0] + 2, sizeof(*ixold)); |
ixold = xrealloc(ixold, len[0] + 2, sizeof(*ixold)); |
|
|
ixnew = xrealloc(ixnew, diff_len[1] + 2, sizeof(*ixnew)); |
ixnew = xrealloc(ixnew, len[1] + 2, sizeof(*ixnew)); |
check(f1, f2, flags); |
check(f1, f2, flags); |
output(f1, f2, flags); |
output(f1, f2, flags); |
|
|
|
|
} |
} |
} |
} |
|
|
static int |
static void |
prepare(int i, FILE *fd, off_t filesize, int flags) |
prepare(int i, FILE *fd, off_t filesize, int flags) |
{ |
{ |
struct line *p; |
struct line *p; |
|
|
|
|
rewind(fd); |
rewind(fd); |
|
|
sz = ((size_t)filesize <= SIZE_MAX ? (size_t)filesize : SIZE_MAX) / 25; |
sz = (filesize <= SIZE_MAX ? filesize : SIZE_MAX) / 25; |
if (sz < 100) |
if (sz < 100) |
sz = 100; |
sz = 100; |
|
|
p = xcalloc(sz + 3, sizeof(*p)); |
p = xcalloc(sz + 3, sizeof(*p)); |
for (j = 0; (h = readhash(fd, flags));) { |
for (j = 0; (h = readhash(fd, flags));) { |
if (j == (int)sz) { |
if (j == sz) { |
sz = sz * 3 / 2; |
sz = sz * 3 / 2; |
p = xrealloc(p, sz + 3, sizeof(*p)); |
p = xrealloc(p, sz + 3, sizeof(*p)); |
} |
} |
p[++j].value = h; |
p[++j].value = h; |
} |
} |
diff_len[i] = j; |
len[i] = j; |
file[i] = p; |
file[i] = p; |
|
|
return (0); |
|
} |
} |
|
|
static void |
static void |
|
|
{ |
{ |
int i, j; |
int i, j; |
|
|
for (pref = 0; pref < diff_len[0] && pref < diff_len[1] && |
for (pref = 0; pref < len[0] && pref < len[1] && |
file[0][pref + 1].value == file[1][pref + 1].value; |
file[0][pref + 1].value == file[1][pref + 1].value; |
pref++) |
pref++) |
; |
; |
for (suff = 0; |
for (suff = 0; |
(suff < diff_len[0] - pref) && (suff < diff_len[1] - pref) && |
(suff < len[0] - pref) && (suff < len[1] - pref) && |
(file[0][diff_len[0] - suff].value == |
(file[0][len[0] - suff].value == |
file[1][diff_len[1] - suff].value); |
file[1][len[1] - suff].value); |
suff++) |
suff++) |
; |
; |
for (j = 0; j < 2; j++) { |
for (j = 0; j < 2; j++) { |
sfile[j] = file[j] + pref; |
sfile[j] = file[j] + pref; |
slen[j] = diff_len[j] - pref - suff; |
slen[j] = len[j] - pref - suff; |
for (i = 0; i <= slen[j]; i++) |
for (i = 0; i <= slen[j]; i++) |
sfile[j][i].serial = i; |
sfile[j][i].serial = i; |
} |
} |
|
|
struct cand *q; |
struct cand *q; |
int i; |
int i; |
|
|
for (i = 0; i <= diff_len[0]; i++) |
for (i = 0; i <= len[0]; i++) |
J[i] = i <= pref ? i : |
J[i] = i <= pref ? i : |
i > diff_len[0] - suff ? i + diff_len[1] - diff_len[0] : 0; |
i > len[0] - suff ? i + len[1] - len[0] : 0; |
for (q = clist + p; q->y != 0; q = clist + q->pred) |
for (q = clist + p; q->y != 0; q = clist + q->pred) |
J[q->x + pref] = q->y + pref; |
J[q->x + pref] = q->y + pref; |
} |
} |
|
|
ixold[0] = ixnew[0] = 0; |
ixold[0] = ixnew[0] = 0; |
jackpot = 0; |
jackpot = 0; |
ctold = ctnew = 0; |
ctold = ctnew = 0; |
for (i = 1; i <= diff_len[0]; i++) { |
for (i = 1; i <= len[0]; i++) { |
if (J[i] == 0) { |
if (J[i] == 0) { |
ixold[i] = ctold += skipline(f1); |
ixold[i] = ctold += skipline(f1); |
continue; |
continue; |
|
|
ixnew[j] = ctnew; |
ixnew[j] = ctnew; |
j++; |
j++; |
} |
} |
for (; j <= diff_len[1]; j++) |
for (; j <= len[1]; j++) |
ixnew[j] = ctnew += skipline(f2); |
ixnew[j] = ctnew += skipline(f2); |
/* |
/* |
* if (jackpot != 0) |
* if (jackpot != 0) |
|
|
|
|
rewind(f1); |
rewind(f1); |
rewind(f2); |
rewind(f2); |
m = diff_len[0]; |
m = len[0]; |
J[0] = 0; |
J[0] = 0; |
J[m + 1] = diff_len[1] + 1; |
J[m + 1] = len[1] + 1; |
for (i0 = 1; i0 <= m; i0 = i1 + 1) { |
for (i0 = 1; i0 <= m; i0 = i1 + 1) { |
while (i0 <= m && J[i0] == J[i0 - 1] + 1) |
while (i0 <= m && J[i0] == J[i0 - 1] + 1) |
i0++; |
i0++; |
|
|
change(f1, f2, i0, i1, j0, j1, flags); |
change(f1, f2, i0, i1, j0, j1, flags); |
} |
} |
if (m == 0) |
if (m == 0) |
change(f1, f2, 1, 0, 1, diff_len[1], flags); |
change(f1, f2, 1, 0, 1, len[1], flags); |
if (diff_format == D_IFDEF) { |
if (diff_format == D_IFDEF) { |
for (;;) { |
for (;;) { |
#define c i0 |
#define c i0 |
|
|
|
|
b = d = 0; /* gcc */ |
b = d = 0; /* gcc */ |
lowa = MAX(1, cvp->a - diff_context); |
lowa = MAX(1, cvp->a - diff_context); |
upb = MIN(diff_len[0], context_vec_ptr->b + diff_context); |
upb = MIN(len[0], context_vec_ptr->b + diff_context); |
lowc = MAX(1, cvp->c - diff_context); |
lowc = MAX(1, cvp->c - diff_context); |
upd = MIN(diff_len[1], context_vec_ptr->d + diff_context); |
upd = MIN(len[1], context_vec_ptr->d + diff_context); |
|
|
diff_output("***************"); |
diff_output("***************"); |
if ((flags & D_PROTOTYPE)) { |
if ((flags & D_PROTOTYPE)) { |
|
|
|
|
b = d = 0; /* gcc */ |
b = d = 0; /* gcc */ |
lowa = MAX(1, cvp->a - diff_context); |
lowa = MAX(1, cvp->a - diff_context); |
upb = MIN(diff_len[0], context_vec_ptr->b + diff_context); |
upb = MIN(len[0], context_vec_ptr->b + diff_context); |
lowc = MAX(1, cvp->c - diff_context); |
lowc = MAX(1, cvp->c - diff_context); |
upd = MIN(diff_len[1], context_vec_ptr->d + diff_context); |
upd = MIN(len[1], context_vec_ptr->d + diff_context); |
|
|
diff_output("@@ -"); |
diff_output("@@ -"); |
uni_range(lowa, upb); |
uni_range(lowa, upb); |