Fixed bug about file content comparison.

This commit is contained in:
Thomas Schmitt 2008-01-25 16:00:51 +00:00
parent 9e2e5817e6
commit 2f28ad5c65

View File

@ -88,7 +88,7 @@ int Compare_2_files(char *adr1, char *adr2, char *adrc, int flag)
differs= 1; differs= 1;
} }
} }
if(S_ISREG(s2.st_mode) && s1.st_size!= s2.st_size) { if(S_ISREG(s2.st_mode) && s1.st_size != s2.st_size) {
printf("%s : st_size : %.f <> %.f\n", printf("%s : st_size : %.f <> %.f\n",
a, (double) s1.st_size, (double) s2.st_size); a, (double) s1.st_size, (double) s2.st_size);
differs= 1; differs= 1;
@ -118,7 +118,7 @@ int Compare_2_files(char *adr1, char *adr2, char *adrc, int flag)
printf("- %s : cannot open() : %s\n", adr1, strerror(errno)); printf("- %s : cannot open() : %s\n", adr1, strerror(errno));
return(0); return(0);
} }
fd2= open(adr1, O_RDONLY); fd2= open(adr2, O_RDONLY);
if(fd2==-1) { if(fd2==-1) {
printf("- %s : cannot open() : %s\n", adr2, strerror(errno)); printf("- %s : cannot open() : %s\n", adr2, strerror(errno));
close(fd1); close(fd1);
@ -132,18 +132,25 @@ int Compare_2_files(char *adr1, char *adr2, char *adrc, int flag)
if((r1==EOF && r2==EOF) || (r1==0 && r2==0)) if((r1==EOF && r2==EOF) || (r1==0 && r2==0))
break; break;
if(r1==EOF || r1==0) { if(r1==EOF || r1==0) {
printf("- %s : early EOF after %d bytes\n", adr1, r1count); if(r1==EOF)
r1= 0;
if(s1.st_size > r1count + r1)
printf("- %s : early EOF after %d bytes\n", adr1, r1count);
differs= 1; differs= 1;
break; break;
} }
r1count+= r1; r1count+= r1;
if(r2==EOF || r2<r1) { if(r2==EOF || r2<r1) {
printf("- %s : early EOF after %d bytes\n", adr2, r2count); if(r2==EOF)
r2= 0;
if(s2.st_size > r2count + r2)
printf("- %s : early EOF after %d bytes\n", adr2, r2count);
differs= 1; differs= 1;
break; break;
} }
if(r2>r1) { if(r2>r1) {
printf("- %s : early EOF after %d bytes\n", adr1, r1count); if(s1.st_size > r1count + r1)
printf("- %s : early EOF after %d bytes\n", adr1, r1count);
differs= 1; differs= 1;
break; break;
} }
@ -157,8 +164,9 @@ int Compare_2_files(char *adr1, char *adr2, char *adrc, int flag)
} }
} }
if(diffcount>0) { if(diffcount>0) {
printf("%s : Content differs by %.f bytes. First at %.f\n", printf("%s : %s : differs by at least %.f bytes. First at %.f\n",
a, (double) diffcount, (double) first_diff); a, (s1.st_size==s2.st_size || s1.st_mtime==s2.st_mtime ?
"CONTENT":"content"), (double) diffcount, (double) first_diff);
differs= 1; differs= 1;
} }
} }
@ -170,13 +178,21 @@ int Compare_2_files(char *adr1, char *adr2, char *adrc, int flag)
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
int ret; int ret, i, with_ctime= 1;
char adr1[4096], adr2[4096], adrc[4096]; char adr1[4096], adr2[4096], adrc[4096];
if(argc<4) { if(argc<4) {
fprintf(stderr, "usage: %s path prefix1 prefix2\n", argv[0]); fprintf(stderr, "usage: %s path prefix1 prefix2\n", argv[0]);
exit(2); exit(2);
} }
for(i= 4; i<argc; i++) {
if(strcmp(argv[i], "-no_ctime")==0)
with_ctime= 0;
else {
fprintf(stderr, "%s : Option not recognized: '%s'\n", argv[0], argv[i]);
exit(1);
}
}
if(strncmp(argv[1], argv[2], strlen(argv[2]))!=0) { if(strncmp(argv[1], argv[2], strlen(argv[2]))!=0) {
fprintf(stderr, "%s: path '%s' does not match prefix1 '%s'\n", fprintf(stderr, "%s: path '%s' does not match prefix1 '%s'\n",
@ -187,7 +203,7 @@ int main(int argc, char **argv)
strcpy(adrc, argv[1]+strlen(argv[2])); strcpy(adrc, argv[1]+strlen(argv[2]));
sprintf(adr2, "%s%s%s", argv[3], (adrc[0]=='/' ? "" : "/"), adrc); sprintf(adr2, "%s%s%s", argv[3], (adrc[0]=='/' ? "" : "/"), adrc);
ret= Compare_2_files(adr1, adr2, adrc, 2); ret= Compare_2_files(adr1, adr2, adrc, (with_ctime<<1));
exit(ret<=0); exit(ret<=0);
} }