version 1.26, 2003/07/08 04:45:32 |
version 1.27, 2003/07/09 00:07:44 |
|
|
|
|
#include "diff.h" |
#include "diff.h" |
|
|
int aflag, bflag, iflag, Nflag, Pflag, rflag, sflag, tflag, wflag; |
int aflag, bflag, iflag, lflag, Nflag, Pflag, rflag, sflag, tflag, wflag; |
int format, context, status; |
int format, context, status; |
char *start, *ifdefname, *diffargs; |
char *start, *ifdefname, *diffargs; |
struct stat stb1, stb2; |
struct stat stb1, stb2; |
struct excludes *excludes_list; |
struct excludes *excludes_list; |
|
|
#define OPTIONS "abC:cD:efhinNPqrS:stU:uwX:x:" |
#define OPTIONS "abC:cD:efhilnNPqrS:stU:uwX:x:" |
static struct option longopts[] = { |
static struct option longopts[] = { |
{ "text", no_argument, 0, 'a' }, |
{ "text", no_argument, 0, 'a' }, |
{ "ignore-space-change", no_argument, 0, 'b' }, |
{ "ignore-space-change", no_argument, 0, 'b' }, |
|
|
{ "ed", no_argument, 0, 'e' }, |
{ "ed", no_argument, 0, 'e' }, |
{ "forward-ed", no_argument, 0, 'f' }, |
{ "forward-ed", no_argument, 0, 'f' }, |
{ "ignore-case", no_argument, 0, 'i' }, |
{ "ignore-case", no_argument, 0, 'i' }, |
|
{ "paginate", no_argument, 0, 'l' }, |
{ "new-file", no_argument, 0, 'N' }, |
{ "new-file", no_argument, 0, 'N' }, |
{ "rcs", no_argument, 0, 'n' }, |
{ "rcs", no_argument, 0, 'n' }, |
{ "unidirectional-new-file", no_argument, 0, 'P' }, |
{ "unidirectional-new-file", no_argument, 0, 'P' }, |
|
|
case 'i': |
case 'i': |
iflag = 1; |
iflag = 1; |
break; |
break; |
|
case 'l': |
|
lflag = 1; |
|
break; |
case 'N': |
case 'N': |
Nflag = 1; |
Nflag = 1; |
break; |
break; |
|
|
error("%s", argv[1]); |
error("%s", argv[1]); |
if (gotstdin && (S_ISDIR(stb1.st_mode) || S_ISDIR(stb2.st_mode))) |
if (gotstdin && (S_ISDIR(stb1.st_mode) || S_ISDIR(stb2.st_mode))) |
errorx("can't compare - to a directory"); |
errorx("can't compare - to a directory"); |
|
set_argstr(oargv, argv); |
if (S_ISDIR(stb1.st_mode) && S_ISDIR(stb2.st_mode)) { |
if (S_ISDIR(stb1.st_mode) && S_ISDIR(stb2.st_mode)) { |
if (format == D_IFDEF) |
if (format == D_IFDEF) |
errorx("-D option not supported with directories"); |
errorx("-D option not supported with directories"); |
set_argstr(oargv, argv); |
|
diffdir(argv[0], argv[1]); |
diffdir(argv[0], argv[1]); |
} else |
} else { |
diffreg(argv[0], argv[1], 0); |
print_status(diffreg(argv[0], argv[1], 0), argv[0], argv[1], |
|
NULL); |
|
} |
exit(status); |
exit(status); |
} |
} |
|
|
|
|
return (q); |
return (q); |
} |
} |
|
|
|
int |
|
easprintf(char **ret, const char *fmt, ...) |
|
{ |
|
int len; |
|
va_list ap; |
|
|
|
va_start(ap, fmt); |
|
len = vasprintf(ret, fmt, ap); |
|
va_end(ap); |
|
|
|
if (len == -1) |
|
error(NULL); |
|
return(len); |
|
} |
|
|
__dead void |
__dead void |
error(const char *fmt, ...) |
error(const char *fmt, ...) |
{ |
{ |
|
|
entry->pattern = pattern; |
entry->pattern = pattern; |
entry->next = excludes_list; |
entry->next = excludes_list; |
excludes_list = entry; |
excludes_list = entry; |
|
} |
|
|
|
void |
|
print_status(int val, char *path1, char *path2, char *entry) |
|
{ |
|
switch (val) { |
|
case D_ONLY: |
|
printf("Only in %s: %s\n", path1, entry); |
|
break; |
|
case D_COMMON: |
|
printf("Common subdirectories: %s%s and %s%s\n", |
|
path1, entry ? entry : "", path2, entry ? entry : ""); |
|
break; |
|
case D_BINARY: |
|
printf("Binary files %s%s and %s%s differ\n", |
|
path1, entry ? entry : "", path2, entry ? entry : ""); |
|
break; |
|
case D_DIFFER: |
|
if (format == D_BRIEF) |
|
printf("Files %s%s and %s%s differ\n", |
|
path1, entry ? entry : "", |
|
path2, entry ? entry : ""); |
|
break; |
|
case D_SAME: |
|
if (sflag) |
|
printf("Files %s%s and %s%s are identical\n", |
|
path1, entry ? entry : "", |
|
path2, entry ? entry : ""); |
|
break; |
|
} |
} |
} |
|
|
__dead void |
__dead void |