diff options
author | Basile Starynkevitch <basile@starynkevitch.net> | 2009-09-22 21:36:50 +0000 |
---|---|---|
committer | Rafael Espindola <espindola@gcc.gnu.org> | 2009-09-22 21:36:50 +0000 |
commit | 41e7ac516e3f7976d062290bad1dcf25449f69b3 (patch) | |
tree | af45ed3a0b306ce509214b3f296ebd22cb64e789 /gcc | |
parent | 0182d01649c1bebd6d912bc87945f1f22d5ce601 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/gengtype.c | 67 |
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; } } |