- char *hfnew = g_strconcat(fullfilebase, ".h#gob#", NULL);
- char *hf = g_strconcat(fullfilebase, ".h", NULL);
- struct stat s;
- if(stat(hf, &s) == 0) {
- char *s;
- s = g_strdup_printf("cmp '%s' '%s' > /dev/null", hf, hfnew);
- if(system(s) == 0) {
- if(unlink(hfnew) != 0)
- error_printf(GOB_ERROR, 0,
- "Can't remove new header file");
- g_free(hfnew);
- g_free(hf);
- g_free(s);
- return;
+ char *new_filename = g_strconcat (old_filename, "#gob#", NULL);
+ FILE *old_f;
+ gboolean equal = FALSE;
+
+ old_f = fopen (old_filename, "r");
+ if (old_f) {
+ FILE *new_f;
+ gboolean error = FALSE;
+
+ new_f = fopen (new_filename, "r");
+ if (new_f) {
+ char new_buf[1024];
+ char old_buf[1024];
+
+ while (TRUE) {
+ size_t new_n;
+ size_t old_n;
+
+ new_n = fread (new_buf, 1, sizeof (new_buf), new_f);
+ if (ferror (new_f)) {
+ error = TRUE;
+ error_printf (GOB_ERROR, 0,
+ "Can't read %s: %s",
+ new_filename,
+ g_strerror (errno));
+ break;
+ }
+
+ old_n = fread (old_buf, 1, sizeof (old_buf), old_f);
+ if (ferror (old_f)
+ || feof (new_f) != feof (old_f)
+ || new_n != old_n
+ || memcmp (new_buf, old_buf, new_n) != 0)
+ break;
+
+ if (feof (new_f)) {
+ equal = TRUE;
+ break;
+ }
+ }
+ } else
+ error_printf (GOB_ERROR, 0, "Can't open %s: %s",
+ new_filename, g_strerror (errno));
+
+ fclose (old_f);
+ fclose (new_f);
+
+ if (error)
+ goto end;
+
+ if (! equal && unlink (old_filename) != 0) {
+ error_printf (GOB_ERROR, 0, "Can't remove %s: %s",
+ old_filename, g_strerror (errno));
+ goto end;