aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorBasile Starynkevitch <basile@starynkevitch.net>2009-09-22 21:36:50 +0000
committerRafael Espindola <espindola@gcc.gnu.org>2009-09-22 21:36:50 +0000
commit41e7ac516e3f7976d062290bad1dcf25449f69b3 (patch)
treeaf45ed3a0b306ce509214b3f296ebd22cb64e789 /gcc
parent0182d01649c1bebd6d912bc87945f1f22d5ce601 (diff)
downloadgcc-41e7ac516e3f7976d062290bad1dcf25449f69b3.zip
gcc-41e7ac516e3f7976d062290bad1dcf25449f69b3.tar.gz
gcc-41e7ac516e3f7976d062290bad1dcf25449f69b3.tar.bz2
gengtype.c (is_file_equal): New function.
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. Co-Authored-By: Rafael Avila de Espindola <espindola@google.com> From-SVN: r152049
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/gengtype.c67
2 files changed, 45 insertions, 28 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9ec0799..3a6c9cd 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/gengtype.c b/gcc/gengtype.c
index 0ee9c48..7d7f9d1 100644
--- a/gcc/gengtype.c
+++ b/gcc/gengtype.c
@@ -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;
}
}