version 1.21, 2003/07/06 22:17:21 |
version 1.22, 2003/07/09 00:07:44 |
|
|
static struct dirent **slurpdir(char *, char **, int); |
static struct dirent **slurpdir(char *, char **, int); |
static void diffit(struct dirent *, char *, size_t, char *, size_t); |
static void diffit(struct dirent *, char *, size_t, char *, size_t); |
|
|
|
#define d_status d_type /* we need to store status for -l */ |
|
|
/* |
/* |
* Diff directory traveral. Will be called recursively if -r was specified. |
* Diff directory traveral. Will be called recursively if -r was specified. |
*/ |
*/ |
|
|
/* file only in first dir, only diff if -N */ |
/* file only in first dir, only diff if -N */ |
if (Nflag) |
if (Nflag) |
diffit(dent1, path1, dirlen1, path2, dirlen2); |
diffit(dent1, path1, dirlen1, path2, dirlen2); |
|
else if (lflag) |
|
dent1->d_status |= D_ONLY; |
else if (format == D_NORMAL || format == D_CONTEXT || |
else if (format == D_NORMAL || format == D_CONTEXT || |
format == D_UNIFIED || format == D_BRIEF) |
format == D_UNIFIED || format == D_BRIEF) |
/* XXX GNU diff always prints this XXX */ |
/* XXX GNU diff always prints this XXX */ |
|
|
/* file only in second dir, only diff if -N or -P */ |
/* file only in second dir, only diff if -N or -P */ |
if (Nflag || Pflag) |
if (Nflag || Pflag) |
diffit(dent2, path1, dirlen1, path2, dirlen2); |
diffit(dent2, path1, dirlen1, path2, dirlen2); |
|
else if (lflag) |
|
dent2->d_status |= D_ONLY; |
else if (format == D_NORMAL || format == D_CONTEXT || |
else if (format == D_NORMAL || format == D_CONTEXT || |
format == D_UNIFIED || format == D_BRIEF) |
format == D_UNIFIED || format == D_BRIEF) |
/* XXX GNU diff always prints this XXX */ |
/* XXX GNU diff always prints this XXX */ |
|
|
dp2++; |
dp2++; |
} |
} |
} |
} |
|
if (lflag) { |
|
path1[dirlen1 - 1] = '\0'; |
|
path2[dirlen2 - 1] = '\0'; |
|
for (dp1 = dirp1; (dent1 = *dp1) != NULL; dp1++) { |
|
print_status(dent1->d_status, path1, path2, |
|
dent1->d_name); |
|
} |
|
for (dp2 = dirp2; (dent2 = *dp2) != NULL; dp2++) { |
|
if (dent2->d_status == D_ONLY) |
|
print_status(dent2->d_status, path2, NULL, |
|
dent2->d_name); |
|
} |
|
} |
|
|
if (dirbuf1 != NULL) { |
if (dirbuf1 != NULL) { |
free(dirp1); |
free(dirp1); |
|
|
for (entries = 0, cp = buf; cp < ebuf; ) { |
for (entries = 0, cp = buf; cp < ebuf; ) { |
dp = (struct dirent *)cp; |
dp = (struct dirent *)cp; |
if (dp->d_fileno != 0 && dp->d_type != DT_WHT && |
if (dp->d_fileno != 0 && dp->d_type != DT_WHT && |
!excluded(dp->d_name)) |
!excluded(dp->d_name)) { |
|
dp->d_status = 0; |
dirlist[entries++] = dp; |
dirlist[entries++] = dp; |
|
} |
if (dp->d_reclen <= 0) |
if (dp->d_reclen <= 0) |
break; |
break; |
cp += dp->d_reclen; |
cp += dp->d_reclen; |
|
|
if (S_ISDIR(stb1.st_mode) && S_ISDIR(stb2.st_mode)) { |
if (S_ISDIR(stb1.st_mode) && S_ISDIR(stb2.st_mode)) { |
if (rflag) |
if (rflag) |
diffdir(path1, path2); |
diffdir(path1, path2); |
|
else if (lflag) |
|
dp->d_status |= D_COMMON; |
else if (format != D_EDIT) |
else if (format != D_EDIT) |
/* XXX GNU diff always prints this for dirs XXX */ |
/* XXX GNU diff always prints this for dirs XXX */ |
printf("Common subdirectories: %s and %s\n", |
printf("Common subdirectories: %s and %s\n", |
path1, path2); |
path1, path2); |
return; |
return; |
} |
} |
diffreg(path1, path2, flags); |
dp->d_status = diffreg(path1, path2, flags); |
} |
} |
|
|
/* |
/* |