jcs
/amend
/amendments
/177
repo: Factor out Create/FSOpen/truncate/FSClose of temp files
jcs made amendment 177 24 days ago
--- repo.c Mon Sep 28 14:29:23 2026
+++ repo.c Mon Sep 28 15:10:40 2026
@@ -33,6 +33,8 @@ short repo_get_file_attrs(struct repo *repo, Str255 fi
short repo_file_update(struct repo *repo, struct repo_file *file);
unsigned short repo_diff_header(struct repo *repo,
struct repo_amendment *amendment, char **ret);
+short repo_write_temp_file(struct repo *repo, struct repo_file *file,
+ Str255 tfilename, char *data, size_t len);
short repo_migrate(struct repo *repo, bool is_new);
pascal Boolean repo_add_file_filter(struct FileParam *pbp);
@@ -772,30 +774,15 @@ repo_diff_file(struct repo *repo, struct repo_file *fi
Str255 fromfilepath, tofilepath;
Str255 label0, label1;
struct repo_file_attrs attrs;
- size_t size;
- char *text;
- short error, ret, frefnum, tofile_empty = 0;
+ size_t size = 0;
+ char *text = NULL;
+ short error, ret, tofile_empty = 0;
/* write out old file */
snprintf((char *)fromfilename, HFS_FILENAME_MAX + 1, "[%lu] %s", Time,
file->filename);
CtoPstr(fromfilename);
- error = Create(fromfilename, repo->bile->vrefnum, file->creator,
- file->type);
- if (error && error != dupFNErr)
- panic("Failed to create file %s: %d", PtoCstr(fromfilename),
- error);
-
- error = FSOpen(fromfilename, repo->bile->vrefnum, &frefnum);
- if (error)
- panic("Failed to open file %s: %d", PtoCstr(fromfilename), error);
-
- error = SetEOF(frefnum, 0);
- if (error)
- panic("Failed to truncate file %s: %d", PtoCstr(fromfilename),
- error);
-
if (file->flags & REPO_FILE_DELETED) {
/* don't write any TEXT resource, the from file should be blank */
} else {
@@ -803,16 +790,11 @@ repo_diff_file(struct repo *repo, struct repo_file *fi
size = bile_read_alloc(repo->bile, REPO_TEXT_RTYPE, file->id,
&text);
- if (size > 0) {
- error = FSWrite(frefnum, &size, text);
- if (error)
- panic("Failed to write old file to %s: %d",
- PtoCstr(fromfilename), error);
- xfree(&text);
- }
}
- FSClose(frefnum);
+ repo_write_temp_file(repo, file, fromfilename, text, size);
+ if (text != NULL)
+ xfree(&text);
if (getpath(repo->bile->vrefnum, fromfilename, &fromfilepath,
true) != 0)
@@ -834,12 +816,8 @@ repo_diff_file(struct repo *repo, struct repo_file *fi
"[deleted] %s", file->filename);
CtoPstr(tofilename);
- error = Create(tofilename, repo->bile->vrefnum, file->creator,
- file->type);
- if (error && error != dupFNErr)
- panic("Failed to create file %s: %d", PtoCstr(tofilename),
- error);
-
+ repo_write_temp_file(repo, file, tofilename, NULL, 0);
+
if (getpath(repo->bile->vrefnum, tofilename, &tofilepath,
true) != 0)
panic("getpath(%d, %s) failed", repo->bile->vrefnum,
@@ -885,6 +863,37 @@ repo_diff_file(struct repo *repo, struct repo_file *fi
return -1;
return 1;
+}
+
+short
+repo_write_temp_file(struct repo *repo, struct repo_file *file,
+ Str255 tfilename, char *data, size_t len)
+{
+ short error, frefnum;
+
+ error = Create(tfilename, repo->bile->vrefnum, file->creator,
+ file->type);
+ if (error && error != dupFNErr)
+ panic("Failed to create file %s: %d", PtoCstr(tfilename), error);
+
+ error = FSOpen(tfilename, repo->bile->vrefnum, &frefnum);
+ if (error)
+ panic("Failed to open file %s: %d", PtoCstr(tfilename), error);
+
+ error = SetEOF(frefnum, 0);
+ if (error)
+ panic("Failed to truncate file %s: %d", PtoCstr(tfilename), error);
+
+ if (len) {
+ error = FSWrite(frefnum, &len, data);
+ if (error)
+ panic("Failed to write file to %s: %d", PtoCstr(tfilename),
+ error);
+ }
+
+ FSClose(frefnum);
+
+ return 0;
}
short