OSDN Git Service

2009-09-22 Basile Starynkevitch <basile@starynkevitch.net>
authorespindola <espindola@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 22 Sep 2009 21:36:50 +0000 (21:36 +0000)
committerespindola <espindola@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 22 Sep 2009 21:36:50 +0000 (21:36 +0000)
            Rafael Avila de Espindola  <espindola@google.com>

* gengtype.c (is_file_equal): New function.
(close_output_files): Use is_file_equal. Free of->buf.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@152049 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/gengtype.c

index 9ec0799..3a6c9cd 100644 (file)
@@ -1,6 +1,12 @@
 2009-09-22  Basile Starynkevitch  <basile@starynkevitch.net>
             Rafael Avila de Espindola  <espindola@google.com>
 
+       * gengtype.c (is_file_equal): New function.
+       (close_output_files): Use is_file_equal. Free of->buf.
+
+2009-09-22  Basile Starynkevitch  <basile@starynkevitch.net>
+            Rafael Avila de Espindola  <espindola@google.com>
+
        * gengtype.c (write_types, write_local): Add the output_header
        argument. Update all callers.
 
index 0ee9c48..7d7f9d1 100644 (file)
@@ -1794,6 +1794,32 @@ get_output_file_name (const char *input_file)
   return NULL;
 }
 
+/* Check if existing file is equal to the in memory buffer. */
+
+static bool
+is_file_equal (outf_p of)
+{
+  FILE *newfile = fopen (of->name, "r");
+  size_t i;
+  bool equal;
+  if (newfile == NULL)
+    return false;
+
+  equal = true;
+  for (i = 0; i < of->bufused; i++)
+    {
+      int ch;
+      ch = fgetc (newfile);
+      if (ch == EOF || ch != (unsigned char) of->buf[i])
+       {
+         equal = false;
+         break;
+       }
+    }
+  fclose (newfile);
+  return equal;
+}
+
 /* Copy the output to its final destination,
    but don't unnecessarily change modification times.  */
 
@@ -1804,35 +1830,20 @@ close_output_files (void)
 
   for (of = output_files; of; of = of->next)
     {
-      FILE * newfile;
 
-      newfile = fopen (of->name, "r");
-      if (newfile != NULL )
-       {
-         int no_write_p;
-         size_t i;
-
-         for (i = 0; i < of->bufused; i++)
-           {
-             int ch;
-             ch = fgetc (newfile);
-             if (ch == EOF || ch != (unsigned char) of->buf[i])
-               break;
-           }
-         no_write_p = i == of->bufused && fgetc (newfile) == EOF;
-         fclose (newfile);
-
-         if (no_write_p)
-           continue;
-       }
-
-      newfile = fopen (of->name, "w");
-      if (newfile == NULL)
-       fatal ("opening output file %s: %s", of->name, strerror (errno));
-      if (fwrite (of->buf, 1, of->bufused, newfile) != of->bufused)
-       fatal ("writing output file %s: %s", of->name, strerror (errno));
-      if (fclose (newfile) != 0)
-       fatal ("closing output file %s: %s", of->name, strerror (errno));
+      if (!is_file_equal(of))
+      {
+        FILE *newfile = fopen (of->name, "w");
+        if (newfile == NULL)
+          fatal ("opening output file %s: %s", of->name, strerror (errno));
+        if (fwrite (of->buf, 1, of->bufused, newfile) != of->bufused)
+          fatal ("writing output file %s: %s", of->name, strerror (errno));
+        if (fclose (newfile) != 0)
+          fatal ("closing output file %s: %s", of->name, strerror (errno));
+      }
+      free(of->buf);
+      of->buf = NULL;
+      of->bufused = of->buflength = 0;
     }
 }
 \f