bug-gnu-utils
[Top][All Lists]
Advanced

[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);



reply via email to

[Prev in Thread] Current Thread [Next in Thread]