version 1.6, 2005/03/30 04:44:52 |
version 1.7, 2005/08/01 08:17:57 |
|
|
struct range new; |
struct range new; |
}; |
}; |
|
|
#define NC 200 |
size_t szchanges; |
struct diff d13[NC]; |
|
struct diff d23[NC]; |
struct diff *d13; |
|
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 |
* reverse order. Its first element must be all zero, the "new" component |
* reverse order. Its first element must be all zero, the "new" component |
|
|
* 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. |
*/ |
*/ |
struct diff de[NC]; |
struct diff *de; |
char overlap[NC]; |
char *overlap; |
int overlapcnt; |
int overlapcnt; |
FILE *fp[3]; |
FILE *fp[3]; |
int cline[3]; /* # of the last-read line in each file (0-2) */ |
int cline[3]; /* # of the last-read line in each file (0-2) */ |
|
|
char *getchange(FILE *); |
char *getchange(FILE *); |
char *getline(FILE *, size_t *); |
char *getline(FILE *, size_t *); |
int number(char **); |
int number(char **); |
int readin(char *, struct diff *); |
int readin(char *, struct diff **); |
int skip(int, int, char *); |
int skip(int, int, char *); |
void change(int, struct range *, int); |
void change(int, struct range *, int); |
void keep(int, struct range *); |
void keep(int, struct range *); |
|
|
void separate(const char *); |
void separate(const char *); |
__dead void edscript(int); |
__dead void edscript(int); |
__dead void trouble(void); |
__dead void trouble(void); |
|
void increase(void); |
__dead void usage(void); |
__dead void usage(void); |
|
|
int |
int |
|
|
argc >= 7 ? argv[6] : argv[4]); |
argc >= 7 ? argv[6] : argv[4]); |
} |
} |
|
|
m = readin(argv[0], d13); |
increase(); |
n = readin(argv[1], d23); |
m = readin(argv[0], &d13); |
|
n = readin(argv[1], &d23); |
for (i = 0; i <= 2; i++) { |
for (i = 0; i <= 2; i++) { |
if ((fp[i] = fopen(argv[i + 2], "r")) == NULL) { |
if ((fp[i] = fopen(argv[i + 2], "r")) == NULL) { |
printf("diff3: can't open %s\n", argv[i + 2]); |
printf("diff3: can't open %s\n", argv[i + 2]); |
|
|
* The vector could be optimized out of existence) |
* The vector could be optimized out of existence) |
*/ |
*/ |
int |
int |
readin(char *name, struct diff *dd) |
readin(char *name, struct diff **dd) |
{ |
{ |
int a, b, c, d, i; |
int a, b, c, d, i; |
char kind, *p; |
char kind, *p; |
|
|
fp[0] = fopen(name, "r"); |
fp[0] = fopen(name, "r"); |
for (i=0; (p = getchange(fp[0])); i++) { |
for (i=0; (p = getchange(fp[0])); i++) { |
if (i >= NC) |
if (i >= szchanges - 1) |
err(EXIT_FAILURE, "too many changes"); |
increase(); |
a = b = number(&p); |
a = b = number(&p); |
if (*p == ',') { |
if (*p == ',') { |
p++; |
p++; |
|
|
c++; |
c++; |
b++; |
b++; |
d++; |
d++; |
dd[i].old.from = a; |
(*dd)[i].old.from = a; |
dd[i].old.to = b; |
(*dd)[i].old.to = b; |
dd[i].new.from = c; |
(*dd)[i].new.from = c; |
dd[i].new.to = d; |
(*dd)[i].new.to = d; |
} |
} |
dd[i].old.from = dd[i-1].old.to; |
(*dd)[i].old.from = (*dd)[i-1].old.to; |
dd[i].new.from = dd[i-1].new.to; |
(*dd)[i].new.from = (*dd)[i-1].new.to; |
(void)fclose(fp[0]); |
(void)fclose(fp[0]); |
return (i); |
return (i); |
} |
} |
|
|
} |
} |
exit(overlapcnt); |
exit(overlapcnt); |
} |
} |
|
|
|
void |
|
increase(void) |
|
{ |
|
struct diff *p; |
|
char *q; |
|
size_t newsz, incr; |
|
|
|
/* are the memset(3) calls needed? */ |
|
newsz = szchanges == 0 ? 64 : 2 * szchanges; |
|
incr = newsz - szchanges; |
|
|
|
p = realloc(d13, newsz * sizeof(struct diff)); |
|
if (p == NULL) |
|
err(1, NULL); |
|
memset(p + szchanges, 0, incr * sizeof(struct diff)); |
|
d13 = p; |
|
p = realloc(d23, newsz * sizeof(struct diff)); |
|
if (p == NULL) |
|
err(1, NULL); |
|
memset(p + szchanges, 0, incr * sizeof(struct diff)); |
|
d23 = p; |
|
p = realloc(de, newsz * sizeof(struct diff)); |
|
if (p == NULL) |
|
err(1, NULL); |
|
memset(p + szchanges, 0, incr * sizeof(struct diff)); |
|
de = p; |
|
q = realloc(overlap, newsz * sizeof(char)); |
|
if (q == NULL) |
|
err(1, NULL); |
|
memset(q + szchanges, 0, incr * sizeof(char)); |
|
overlap = q; |
|
szchanges = newsz; |
|
} |
|
|
|
|
__dead void |
__dead void |
usage(void) |
usage(void) |