version 1.52, 2010/07/23 08:31:19 |
version 1.53, 2010/07/23 21:46:05 |
|
|
|
|
static size_t szchanges; |
static size_t szchanges; |
|
|
static struct diff *d13 = NULL; |
static struct diff *d13; |
static struct diff *d23 = NULL; |
static struct diff *d23; |
|
|
/* |
/* |
* "de" is used to gather editing scripts. These are later spewed out in |
* "de" is used to gather editing scripts. These are later spewed out in |
|
|
* look (!?). Array overlap indicates which sections in "de" correspond to |
* look (!?). Array overlap indicates which sections in "de" correspond to |
* lines that are different in all three files. |
* lines that are different in all three files. |
*/ |
*/ |
static struct diff *de = NULL; |
static struct diff *de; |
static char *overlap = NULL; |
static char *overlap; |
static int overlapcnt = 0; |
static int overlapcnt = 0; |
static FILE *fp[3]; |
static FILE *fp[3]; |
static int cline[3]; /* # of the last-read line in each file (0-2) */ |
static int cline[3]; /* # of the last-read line in each file (0-2) */ |
|
|
char *dp13, *dp23, *path1, *path2, *path3; |
char *dp13, *dp23, *path1, *path2, *path3; |
BUF *b1, *b2, *b3, *d1, *d2, *diffb; |
BUF *b1, *b2, *b3, *d1, *d2, *diffb; |
size_t dlen, plen; |
size_t dlen, plen; |
struct cvs_line *lp; |
struct rcs_line *lp; |
struct cvs_lines *dlines, *plines; |
struct rcs_lines *dlines, *plines; |
|
|
overlapcnt = 0; |
overlapcnt = 0; |
b1 = b2 = b3 = d1 = d2 = diffb = NULL; |
b1 = b2 = b3 = d1 = d2 = diffb = NULL; |
|
|
rcsnum_tostr(d3rev1, r1, sizeof(r1)); |
rcsnum_tostr(d3rev1, r1, sizeof(r1)); |
rcsnum_tostr(d3rev2, r2, sizeof(r2)); |
rcsnum_tostr(d3rev2, r2, sizeof(r2)); |
|
|
b1 = cvs_buf_load_fd(cf->fd); |
b1 = buf_load_fd(cf->fd); |
d1 = cvs_buf_alloc(128); |
d1 = buf_alloc(128); |
d2 = cvs_buf_alloc(128); |
d2 = buf_alloc(128); |
diffb = cvs_buf_alloc(128); |
diffb = buf_alloc(128); |
|
|
(void)xasprintf(&path1, "%s/diff1.XXXXXXXXXX", cvs_tmpdir); |
(void)xasprintf(&path1, "%s/diff1.XXXXXXXXXX", cvs_tmpdir); |
(void)xasprintf(&path2, "%s/diff2.XXXXXXXXXX", cvs_tmpdir); |
(void)xasprintf(&path2, "%s/diff2.XXXXXXXXXX", cvs_tmpdir); |
(void)xasprintf(&path3, "%s/diff3.XXXXXXXXXX", cvs_tmpdir); |
(void)xasprintf(&path3, "%s/diff3.XXXXXXXXXX", cvs_tmpdir); |
|
|
fds[2] = cvs_buf_write_stmp(b1, path1, NULL); |
fds[2] = buf_write_stmp(b1, path1, NULL); |
if (verbose == 1) |
if (verbose == 1) |
cvs_printf("Retrieving revision %s\n", r1); |
cvs_printf("Retrieving revision %s\n", r1); |
fds[3] = rcs_rev_write_stmp(cf->file_rcs, d3rev1, path2, 0); |
fds[3] = rcs_rev_write_stmp(cf->file_rcs, d3rev1, path2, 0); |
|
|
diffreg(path2, path3, fds[3], fds[4], d2, D_FORCEASCII); |
diffreg(path2, path3, fds[3], fds[4], d2, D_FORCEASCII); |
|
|
(void)xasprintf(&dp13, "%s/d13.XXXXXXXXXX", cvs_tmpdir); |
(void)xasprintf(&dp13, "%s/d13.XXXXXXXXXX", cvs_tmpdir); |
fds[0] = cvs_buf_write_stmp(d1, dp13, NULL); |
fds[0] = buf_write_stmp(d1, dp13, NULL); |
cvs_buf_free(d1); |
buf_free(d1); |
|
|
(void)xasprintf(&dp23, "%s/d23.XXXXXXXXXX", cvs_tmpdir); |
(void)xasprintf(&dp23, "%s/d23.XXXXXXXXXX", cvs_tmpdir); |
fds[1] = cvs_buf_write_stmp(d2, dp23, NULL); |
fds[1] = buf_write_stmp(d2, dp23, NULL); |
cvs_buf_free(d2); |
buf_free(d2); |
|
|
argc = 0; |
argc = 0; |
diffbuf = diffb; |
diffbuf = diffb; |
|
|
if (diff3_conflicts < 0) |
if (diff3_conflicts < 0) |
fatal("cvs_merge_file: merging failed for an unknown reason"); |
fatal("cvs_merge_file: merging failed for an unknown reason"); |
|
|
plen = cvs_buf_len(diffb); |
plen = buf_len(diffb); |
patch = cvs_buf_release(diffb); |
patch = buf_release(diffb); |
dlen = cvs_buf_len(b1); |
dlen = buf_len(b1); |
data = cvs_buf_release(b1); |
data = buf_release(b1); |
|
|
if (verbose == 1) |
if (verbose == 1) |
cvs_printf("Merging differences between %s and %s into `%s'\n", |
cvs_printf("Merging differences between %s and %s into `%s'\n", |
|
|
} |
} |
|
|
int |
int |
ed_patch_lines(struct cvs_lines *dlines, struct cvs_lines *plines) |
ed_patch_lines(struct rcs_lines *dlines, struct rcs_lines *plines) |
{ |
{ |
char op, *ep; |
char op, *ep; |
struct cvs_line *sort, *lp, *dlp, *ndlp, *insert_after; |
struct rcs_line *sort, *lp, *dlp, *ndlp, *insert_after; |
int start, end, i, lineno; |
int start, end, i, lineno; |
u_char tmp; |
u_char tmp; |
|
|
|
|
(void)fseek(fp[2], (long)de[n].new.from, SEEK_SET); |
(void)fseek(fp[2], (long)de[n].new.from, SEEK_SET); |
for (k = de[n].new.to-de[n].new.from; k > 0; k-= j) { |
for (k = de[n].new.to-de[n].new.from; k > 0; k-= j) { |
j = k > BUFSIZ ? BUFSIZ : k; |
j = k > BUFSIZ ? BUFSIZ : k; |
if (fread(block, (size_t)1, (size_t)j, |
if (fread(block, 1, j, fp[2]) != j) |
fp[2]) != (size_t)j) |
|
return (-1); |
return (-1); |
block[j] = '\0'; |
block[j] = '\0'; |
diff_output("%s", block); |
diff_output("%s", block); |