[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Diff says "binary file_s_ differ" even though one isn't binary
From: |
Paul Eggert |
Subject: |
Re: Diff says "binary file_s_ differ" even though one isn't binary |
Date: |
Wed, 26 Jun 2002 18:41:19 -0700 (PDT) |
> From: Dan Jacobson <address@hidden>
> Newsgroups: gnu.utils.bug
> User-Agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.2
> Date: 27 Jun 2002 03:02:27 +0800
>
> Diff says "binary file_s_ differ" even though one isn't binary.
Thanks for your bug report. Please try this patch, relative to
GNU diffutils 2.8.3 <ftp://alpha.gnu.org/gnu/diffutils/diffutils-2.8.3.tar.gz>
===================================================================
RCS file: src/RCS/diff.h,v
retrieving revision 1.25
diff -pu -r1.25 src/diff.h
--- src/diff.h 2002/06/17 05:55:42 1.25
+++ src/diff.h 2002/06/27 01:36:40
@@ -334,7 +334,7 @@ void print_ifdef_script (struct change *
/* io.c */
void file_block_read (struct file_data *, size_t);
-bool read_files (struct file_data[], bool);
+int read_files (struct file_data[], bool);
/* normal.c */
void print_normal_script (struct change *);
===================================================================
RCS file: src/RCS/analyze.c,v
retrieving revision 1.19
diff -pu -r1.19 src/analyze.c
--- src/analyze.c 2002/06/11 06:06:32 1.19
+++ src/analyze.c 2002/06/27 00:09:32
@@ -797,22 +797,26 @@ build_script (struct file_data const fil
}
/* If CHANGES, briefly report that two files differed.
+ (BINARY_FILES << f) is nonzero if file f is assumed to be binary.
Return 2 if trouble, CHANGES otherwise. */
static int
-briefly_report (int changes, struct file_data const filevec[])
+briefly_report (int changes, int binary_files,
+ struct file_data const filevec[])
{
if (changes)
{
+ static char const *binary_files_msgid[] =
+ {
+ N_("Files %s and %s differ\n"),
+ N_("Binary file %s differs from text file %s\n"),
+ N_("Text file %s differs from binary file %s\n"),
+ N_("Binary files %s and %s differ\n")
+ };
char const *label0 = file_label[0] ? file_label[0] : filevec[0].name;
char const *label1 = file_label[1] ? file_label[1] : filevec[1].name;
-
- if (brief)
- message ("Files %s and %s differ\n", label0, label1);
- else
- {
- message ("Binary files %s and %s differ\n", label0, label1);
- changes = 2;
- }
+ message (_(binary_files_msgid[binary_files]), label0, label1);
+ if (binary_files)
+ changes = 2;
}
return changes;
@@ -822,6 +826,7 @@ briefly_report (int changes, struct file
int
diff_2_files (struct comparison *cmp)
{
+ int binary_files = read_files (cmp->file, files_can_be_treated_as_binary);
lin diags;
int f;
struct change *e, *p;
@@ -835,7 +840,7 @@ diff_2_files (struct comparison *cmp)
Also, --brief without any --ignore-* options means
we can speed things up by treating the files as binary. */
- if (read_files (cmp->file, files_can_be_treated_as_binary))
+ if (binary_files)
{
/* Files with different lengths must be different. */
if (cmp->file[0].stat.st_size != cmp->file[1].stat.st_size
@@ -888,7 +893,7 @@ diff_2_files (struct comparison *cmp)
}
}
- changes = briefly_report (changes, cmp->file);
+ changes = briefly_report (changes, brief ? 0 : binary_files, cmp->file);
}
else
{
@@ -981,7 +986,7 @@ diff_2_files (struct comparison *cmp)
changes = (script != 0);
if (brief)
- changes = briefly_report (changes, cmp->file);
+ changes = briefly_report (changes, 0, cmp->file);
else
{
if (changes | !no_diff_means_no_output)
===================================================================
RCS file: src/RCS/io.c,v
retrieving revision 1.26
diff -pu -r1.26 src/io.c
--- src/io.c 2002/06/11 06:06:32 1.26
+++ src/io.c 2002/06/27 00:15:50
@@ -802,29 +802,34 @@ verify (enough_prime_offsets,
/* Given a vector of two file_data objects, read the file associated
with each one, and build the table of equivalence classes.
- Return nonzero if either file appears to be a binary file.
+ If R is the return value, then (R << F) is nonzero if file
+ F appears to be binary.
If PRETEND_BINARY is nonzero, pretend they are binary regardless. */
-bool
+int
read_files (struct file_data filevec[], bool pretend_binary)
{
int i;
bool skip_test = text | pretend_binary;
- bool appears_binary = pretend_binary | sip (&filevec[0], skip_test);
+ bool appears_binary0 = pretend_binary | sip (&filevec[0], skip_test);
+ bool appears_binary1;
+ int appears_binary;
if (filevec[0].desc != filevec[1].desc)
- appears_binary |= sip (&filevec[1], skip_test | appears_binary);
+ appears_binary1 = sip (&filevec[1], skip_test | appears_binary0);
else
{
filevec[1].buffer = filevec[0].buffer;
filevec[1].bufsize = filevec[0].bufsize;
filevec[1].buffered = filevec[0].buffered;
+ appears_binary1 = appears_binary0;
}
+ appears_binary = (appears_binary1 << 1) + (appears_binary0 << 0);
if (appears_binary)
{
set_binary_mode (filevec[0].desc, 1);
set_binary_mode (filevec[1].desc, 1);
- return 1;
+ return appears_binary;
}
find_identical_ends (filevec);