commit 809d0d0b36dd61a5ab4d296b1129a6d567d93ba9
parent 30f7c260595185272ef2b841e985207d67db7aa6
Author: Chris Bracken <chris@bracken.jp>
Date: Tue, 6 Jan 2026 17:03:23 +0900
Improve type safety in writer types
Uses explicit type names for the Gopher and HTML writer types. This
avoids void pointers throughout the writer API and reduces the set of
casts down to the initial function assignments in the structs.
Diffstat:
10 files changed, 143 insertions(+), 143 deletions(-)
diff --git a/src/writer/gopher/index_writer.c b/src/writer/gopher/index_writer.c
@@ -27,17 +27,14 @@ void gopher_indexwriter_free(GopherIndexWriter* writer) {
free(writer);
}
-void gopher_indexwriter_begin(void* writer) {
- GopherIndexWriter* gopher_writer = (GopherIndexWriter*)writer;
- gopher_repoindex_begin(gopher_writer->index);
+void gopher_indexwriter_begin(GopherIndexWriter* writer) {
+ gopher_repoindex_begin(writer->index);
}
-void gopher_indexwriter_add_repo(void* writer, GitRepo* repo) {
- GopherIndexWriter* gopher_writer = (GopherIndexWriter*)writer;
- gopher_repoindex_add_repo(gopher_writer->index, repo);
+void gopher_indexwriter_add_repo(GopherIndexWriter* writer, GitRepo* repo) {
+ gopher_repoindex_add_repo(writer->index, repo);
}
-void gopher_indexwriter_end(void* writer) {
- GopherIndexWriter* gopher_writer = (GopherIndexWriter*)writer;
- gopher_repoindex_end(gopher_writer->index);
+void gopher_indexwriter_end(GopherIndexWriter* writer) {
+ gopher_repoindex_end(writer->index);
}
diff --git a/src/writer/gopher/index_writer.h b/src/writer/gopher/index_writer.h
@@ -7,8 +7,8 @@ typedef struct GopherIndexWriter GopherIndexWriter;
GopherIndexWriter* gopher_indexwriter_create();
void gopher_indexwriter_free(GopherIndexWriter* writer);
-void gopher_indexwriter_begin(void* writer);
-void gopher_indexwriter_add_repo(void* writer, GitRepo* repo);
-void gopher_indexwriter_end(void* writer);
+void gopher_indexwriter_begin(GopherIndexWriter* writer);
+void gopher_indexwriter_add_repo(GopherIndexWriter* writer, GitRepo* repo);
+void gopher_indexwriter_end(GopherIndexWriter* writer);
#endif // GOUT_WRITER_GOPHER_INDEX_WRITER_H_
diff --git a/src/writer/gopher/repo_writer.c b/src/writer/gopher/repo_writer.c
@@ -55,49 +55,48 @@ void gopher_repowriter_free(GopherRepoWriter* writer) {
free(writer);
}
-void gopher_repowriter_set_log_cachefile(void* writer, const char* cachefile) {
- GopherRepoWriter* gopher_writer = (GopherRepoWriter*)writer;
- gopher_log_set_cachefile(gopher_writer->log, cachefile);
+void gopher_repowriter_set_log_cachefile(GopherRepoWriter* writer,
+ const char* cachefile) {
+ gopher_log_set_cachefile(writer->log, cachefile);
}
-void gopher_repowriter_set_log_commit_limit(void* writer, size_t count) {
- GopherRepoWriter* gopher_writer = (GopherRepoWriter*)writer;
- gopher_log_set_commit_limit(gopher_writer->log, count);
+void gopher_repowriter_set_log_commit_limit(GopherRepoWriter* writer,
+ size_t count) {
+ gopher_log_set_commit_limit(writer->log, count);
}
-void gopher_repowriter_set_baseurl(void* writer, const char* baseurl) {
- GopherRepoWriter* gopher_writer = (GopherRepoWriter*)writer;
- atom_set_baseurl(gopher_writer->atom, baseurl);
- atom_set_baseurl(gopher_writer->tags, baseurl);
+void gopher_repowriter_set_baseurl(GopherRepoWriter* writer,
+ const char* baseurl) {
+ atom_set_baseurl(writer->atom, baseurl);
+ atom_set_baseurl(writer->tags, baseurl);
}
-void gopher_repowriter_begin(void* writer) {
- GopherRepoWriter* gopher_writer = (GopherRepoWriter*)writer;
+void gopher_repowriter_begin(GopherRepoWriter* writer) {
mkdir("commit", S_IRWXU | S_IRWXG | S_IRWXO);
mkdir("file", S_IRWXU | S_IRWXG | S_IRWXO);
- gopher_refs_begin(gopher_writer->refs);
- gopher_log_begin(gopher_writer->log);
- atom_begin(gopher_writer->atom);
- atom_begin(gopher_writer->tags);
- gopher_files_begin(gopher_writer->files);
+ gopher_refs_begin(writer->refs);
+ gopher_log_begin(writer->log);
+ atom_begin(writer->atom);
+ atom_begin(writer->tags);
+ gopher_files_begin(writer->files);
}
-void gopher_repowriter_add_commit(void* writer, const GitCommit* git_commit) {
- GopherRepoWriter* gopher_writer = (GopherRepoWriter*)writer;
+void gopher_repowriter_add_commit(GopherRepoWriter* writer,
+ const GitCommit* git_commit) {
char filename[PATH_MAX];
if (snprintf(filename, sizeof(filename), "%s.gph",
gitcommit_oid(git_commit)) < 0) {
err(1, "snprintf");
}
char* path = path_concat("commit", filename);
- atom_add_commit(gopher_writer->atom, git_commit, path, "", "");
+ atom_add_commit(writer->atom, git_commit, path, "", "");
free(path);
- if (gopher_log_can_add_commits(gopher_writer->log)) {
- gopher_log_add_commit(gopher_writer->log, git_commit);
+ if (gopher_log_can_add_commits(writer->log)) {
+ gopher_log_add_commit(writer->log, git_commit);
GopherCommit* commit =
- gopher_commit_create(gopher_writer->repo, gitcommit_oid(git_commit),
+ gopher_commit_create(writer->repo, gitcommit_oid(git_commit),
gitcommit_summary(git_commit));
gopher_commit_begin(commit);
gopher_commit_add_commit(commit, git_commit);
@@ -106,9 +105,9 @@ void gopher_repowriter_add_commit(void* writer, const GitCommit* git_commit) {
}
}
-void gopher_repowriter_add_reference(void* writer, const GitReference* ref) {
- GopherRepoWriter* gopher_writer = (GopherRepoWriter*)writer;
- gopher_refs_add_ref(gopher_writer->refs, ref);
+void gopher_repowriter_add_reference(GopherRepoWriter* writer,
+ const GitReference* ref) {
+ gopher_refs_add_ref(writer->refs, ref);
if (gitreference_type(ref) == kReftypeTag) {
GitCommit* commit = gitreference_commit(ref);
char filename[PATH_MAX];
@@ -117,29 +116,27 @@ void gopher_repowriter_add_reference(void* writer, const GitReference* ref) {
err(1, "snprintf");
}
char* path = path_concat("commit", filename);
- atom_add_commit(gopher_writer->tags, commit, path, "",
+ atom_add_commit(writer->tags, commit, path, "",
gitreference_shorthand(ref));
free(path);
}
}
-void gopher_repowriter_add_file(void* writer, const GitFile* file) {
- GopherRepoWriter* gopher_writer = (GopherRepoWriter*)writer;
- gopher_files_add_file(gopher_writer->files, file);
+void gopher_repowriter_add_file(GopherRepoWriter* writer, const GitFile* file) {
+ gopher_files_add_file(writer->files, file);
GopherFileBlob* blob =
- gopher_fileblob_create(gopher_writer->repo, gitfile_repo_path(file));
+ gopher_fileblob_create(writer->repo, gitfile_repo_path(file));
gopher_fileblob_begin(blob);
gopher_fileblob_add_file(blob, file);
gopher_fileblob_end(blob);
gopher_fileblob_free(blob);
}
-void gopher_repowriter_end(void* writer) {
- GopherRepoWriter* gopher_writer = (GopherRepoWriter*)writer;
- gopher_refs_end(gopher_writer->refs);
- gopher_log_end(gopher_writer->log);
- atom_end(gopher_writer->atom);
- atom_end(gopher_writer->tags);
- gopher_files_end(gopher_writer->files);
+void gopher_repowriter_end(GopherRepoWriter* writer) {
+ gopher_refs_end(writer->refs);
+ gopher_log_end(writer->log);
+ atom_end(writer->atom);
+ atom_end(writer->tags);
+ gopher_files_end(writer->files);
}
diff --git a/src/writer/gopher/repo_writer.h b/src/writer/gopher/repo_writer.h
@@ -12,13 +12,18 @@ typedef struct GopherRepoWriter GopherRepoWriter;
GopherRepoWriter* gopher_repowriter_create(const GitRepo* repo);
void gopher_repowriter_free(GopherRepoWriter* writer);
-void gopher_repowriter_set_log_cachefile(void* writer, const char* cachefile);
-void gopher_repowriter_set_log_commit_limit(void* writer, size_t count);
-void gopher_repowriter_set_baseurl(void* writer, const char* baseurl);
-void gopher_repowriter_begin(void* writer);
-void gopher_repowriter_add_commit(void* writer, const GitCommit* commit);
-void gopher_repowriter_add_reference(void* writer, const GitReference* ref);
-void gopher_repowriter_add_file(void* writer, const GitFile* file);
-void gopher_repowriter_end(void* writer);
+void gopher_repowriter_set_log_cachefile(GopherRepoWriter* writer,
+ const char* cachefile);
+void gopher_repowriter_set_log_commit_limit(GopherRepoWriter* writer,
+ size_t count);
+void gopher_repowriter_set_baseurl(GopherRepoWriter* writer,
+ const char* baseurl);
+void gopher_repowriter_begin(GopherRepoWriter* writer);
+void gopher_repowriter_add_commit(GopherRepoWriter* writer,
+ const GitCommit* commit);
+void gopher_repowriter_add_reference(GopherRepoWriter* writer,
+ const GitReference* ref);
+void gopher_repowriter_add_file(GopherRepoWriter* writer, const GitFile* file);
+void gopher_repowriter_end(GopherRepoWriter* writer);
#endif // GOUT_WRITER_GOPHER_REPO_WRITER_H_
diff --git a/src/writer/html/index_writer.c b/src/writer/html/index_writer.c
@@ -27,22 +27,18 @@ void html_indexwriter_free(HtmlIndexWriter* writer) {
free(writer);
}
-void html_indexwriter_set_me_url(void* writer, const char* url) {
- HtmlIndexWriter* html_writer = (HtmlIndexWriter*)writer;
- html_repoindex_set_me_url(html_writer->index, url);
+void html_indexwriter_set_me_url(HtmlIndexWriter* writer, const char* url) {
+ html_repoindex_set_me_url(writer->index, url);
}
-void html_indexwriter_begin(void* writer) {
- HtmlIndexWriter* html_writer = (HtmlIndexWriter*)writer;
- html_repoindex_begin(html_writer->index);
+void html_indexwriter_begin(HtmlIndexWriter* writer) {
+ html_repoindex_begin(writer->index);
}
-void html_indexwriter_add_repo(void* writer, GitRepo* repo) {
- HtmlIndexWriter* html_writer = (HtmlIndexWriter*)writer;
- html_repoindex_add_repo(html_writer->index, repo);
+void html_indexwriter_add_repo(HtmlIndexWriter* writer, GitRepo* repo) {
+ html_repoindex_add_repo(writer->index, repo);
}
-void html_indexwriter_end(void* writer) {
- HtmlIndexWriter* html_writer = (HtmlIndexWriter*)writer;
- html_repoindex_end(html_writer->index);
+void html_indexwriter_end(HtmlIndexWriter* writer) {
+ html_repoindex_end(writer->index);
}
diff --git a/src/writer/html/index_writer.h b/src/writer/html/index_writer.h
@@ -7,9 +7,9 @@ typedef struct HtmlIndexWriter HtmlIndexWriter;
HtmlIndexWriter* html_indexwriter_create();
void html_indexwriter_free(HtmlIndexWriter* writer);
-void html_indexwriter_set_me_url(void* writer, const char* url);
-void html_indexwriter_begin(void* writer);
-void html_indexwriter_add_repo(void* writer, GitRepo* repo);
-void html_indexwriter_end(void* writer);
+void html_indexwriter_set_me_url(HtmlIndexWriter* writer, const char* url);
+void html_indexwriter_begin(HtmlIndexWriter* writer);
+void html_indexwriter_add_repo(HtmlIndexWriter* writer, GitRepo* repo);
+void html_indexwriter_end(HtmlIndexWriter* writer);
#endif // GOUT_WRITER_HTML_INDEX_WRITER_H_
diff --git a/src/writer/html/repo_writer.c b/src/writer/html/repo_writer.c
@@ -55,49 +55,47 @@ void html_repowriter_free(HtmlRepoWriter* writer) {
free(writer);
}
-void html_repowriter_set_log_cachefile(void* writer, const char* cachefile) {
- HtmlRepoWriter* html_writer = (HtmlRepoWriter*)writer;
- html_log_set_cachefile(html_writer->log, cachefile);
+void html_repowriter_set_log_cachefile(HtmlRepoWriter* writer,
+ const char* cachefile) {
+ html_log_set_cachefile(writer->log, cachefile);
}
-void html_repowriter_set_log_commit_limit(void* writer, size_t count) {
- HtmlRepoWriter* html_writer = (HtmlRepoWriter*)writer;
- html_log_set_commit_limit(html_writer->log, count);
+void html_repowriter_set_log_commit_limit(HtmlRepoWriter* writer,
+ size_t count) {
+ html_log_set_commit_limit(writer->log, count);
}
-void html_repowriter_set_baseurl(void* writer, const char* baseurl) {
- HtmlRepoWriter* html_writer = (HtmlRepoWriter*)writer;
- atom_set_baseurl(html_writer->atom, baseurl);
- atom_set_baseurl(html_writer->tags, baseurl);
+void html_repowriter_set_baseurl(HtmlRepoWriter* writer, const char* baseurl) {
+ atom_set_baseurl(writer->atom, baseurl);
+ atom_set_baseurl(writer->tags, baseurl);
}
-void html_repowriter_begin(void* writer) {
- HtmlRepoWriter* html_writer = (HtmlRepoWriter*)writer;
+void html_repowriter_begin(HtmlRepoWriter* writer) {
mkdir("commit", S_IRWXU | S_IRWXG | S_IRWXO);
mkdir("file", S_IRWXU | S_IRWXG | S_IRWXO);
- html_refs_begin(html_writer->refs);
- html_log_begin(html_writer->log);
- atom_begin(html_writer->atom);
- atom_begin(html_writer->tags);
- html_files_begin(html_writer->files);
+ html_refs_begin(writer->refs);
+ html_log_begin(writer->log);
+ atom_begin(writer->atom);
+ atom_begin(writer->tags);
+ html_files_begin(writer->files);
}
-void html_repowriter_add_commit(void* writer, const GitCommit* git_commit) {
- HtmlRepoWriter* html_writer = (HtmlRepoWriter*)writer;
+void html_repowriter_add_commit(HtmlRepoWriter* writer,
+ const GitCommit* git_commit) {
char filename[PATH_MAX];
if (snprintf(filename, sizeof(filename), "%s.html",
gitcommit_oid(git_commit)) < 0) {
err(1, "snprintf");
}
char* path = path_concat("commit", filename);
- atom_add_commit(html_writer->atom, git_commit, path, "text/html", "");
+ atom_add_commit(writer->atom, git_commit, path, "text/html", "");
free(path);
- if (html_log_can_add_commits(html_writer->log)) {
- html_log_add_commit(html_writer->log, git_commit);
+ if (html_log_can_add_commits(writer->log)) {
+ html_log_add_commit(writer->log, git_commit);
HtmlCommit* commit =
- html_commit_create(html_writer->repo, gitcommit_oid(git_commit),
+ html_commit_create(writer->repo, gitcommit_oid(git_commit),
gitcommit_summary(git_commit));
html_commit_begin(commit);
html_commit_add_commit(commit, git_commit);
@@ -106,9 +104,9 @@ void html_repowriter_add_commit(void* writer, const GitCommit* git_commit) {
}
}
-void html_repowriter_add_reference(void* writer, const GitReference* ref) {
- HtmlRepoWriter* html_writer = (HtmlRepoWriter*)writer;
- html_refs_add_ref(html_writer->refs, ref);
+void html_repowriter_add_reference(HtmlRepoWriter* writer,
+ const GitReference* ref) {
+ html_refs_add_ref(writer->refs, ref);
if (gitreference_type(ref) == kReftypeTag) {
GitCommit* commit = gitreference_commit(ref);
char filename[PATH_MAX];
@@ -117,29 +115,27 @@ void html_repowriter_add_reference(void* writer, const GitReference* ref) {
err(1, "snprintf");
}
char* path = path_concat("commit", filename);
- atom_add_commit(html_writer->tags, commit, path, "text/html",
+ atom_add_commit(writer->tags, commit, path, "text/html",
gitreference_shorthand(ref));
free(path);
}
}
-void html_repowriter_add_file(void* writer, const GitFile* file) {
- HtmlRepoWriter* html_writer = (HtmlRepoWriter*)writer;
- html_files_add_file(html_writer->files, file);
+void html_repowriter_add_file(HtmlRepoWriter* writer, const GitFile* file) {
+ html_files_add_file(writer->files, file);
HtmlFileBlob* blob =
- html_fileblob_create(html_writer->repo, gitfile_repo_path(file));
+ html_fileblob_create(writer->repo, gitfile_repo_path(file));
html_fileblob_begin(blob);
html_fileblob_add_file(blob, file);
html_fileblob_end(blob);
html_fileblob_free(blob);
}
-void html_repowriter_end(void* writer) {
- HtmlRepoWriter* html_writer = (HtmlRepoWriter*)writer;
- html_refs_end(html_writer->refs);
- html_log_end(html_writer->log);
- atom_end(html_writer->atom);
- atom_end(html_writer->tags);
- html_files_end(html_writer->files);
+void html_repowriter_end(HtmlRepoWriter* writer) {
+ html_refs_end(writer->refs);
+ html_log_end(writer->log);
+ atom_end(writer->atom);
+ atom_end(writer->tags);
+ html_files_end(writer->files);
}
diff --git a/src/writer/html/repo_writer.h b/src/writer/html/repo_writer.h
@@ -12,13 +12,16 @@ typedef struct HtmlRepoWriter HtmlRepoWriter;
HtmlRepoWriter* html_repowriter_create(const GitRepo* repo);
void html_repowriter_free(HtmlRepoWriter* writer);
-void html_repowriter_set_log_cachefile(void* writer, const char* cachefile);
-void html_repowriter_set_log_commit_limit(void* writer, size_t count);
-void html_repowriter_set_baseurl(void* writer, const char* baseurl);
-void html_repowriter_begin(void* writer);
-void html_repowriter_add_commit(void* writer, const GitCommit* commit);
-void html_repowriter_add_reference(void* writer, const GitReference* ref);
-void html_repowriter_add_file(void* writer, const GitFile* file);
-void html_repowriter_end(void* writer);
+void html_repowriter_set_log_cachefile(HtmlRepoWriter* writer,
+ const char* cachefile);
+void html_repowriter_set_log_commit_limit(HtmlRepoWriter* writer, size_t count);
+void html_repowriter_set_baseurl(HtmlRepoWriter* writer, const char* baseurl);
+void html_repowriter_begin(HtmlRepoWriter* writer);
+void html_repowriter_add_commit(HtmlRepoWriter* writer,
+ const GitCommit* commit);
+void html_repowriter_add_reference(HtmlRepoWriter* writer,
+ const GitReference* ref);
+void html_repowriter_add_file(HtmlRepoWriter* writer, const GitFile* file);
+void html_repowriter_end(HtmlRepoWriter* writer);
#endif // GOUT_WRITER_HTML_REPO_WRITER_H_
diff --git a/src/writer/index_writer.c b/src/writer/index_writer.c
@@ -77,10 +77,10 @@ IndexWriter* htmlindexwriter_create() {
HtmlIndexWriter* html_writer = html_indexwriter_create();
writer->type = kIndexWriterTypeHtml;
writer->impl = html_writer;
- writer->set_me_url = html_indexwriter_set_me_url;
- writer->begin = html_indexwriter_begin;
- writer->add_repo = html_indexwriter_add_repo;
- writer->end = html_indexwriter_end;
+ writer->set_me_url = (IndexWriterStringFunc)html_indexwriter_set_me_url;
+ writer->begin = (IndexWriterVoidFunc)html_indexwriter_begin;
+ writer->add_repo = (IndexWriterRepoInfoFunc)html_indexwriter_add_repo;
+ writer->end = (IndexWriterVoidFunc)html_indexwriter_end;
return writer;
}
@@ -101,9 +101,9 @@ IndexWriter* gopherindexwriter_create() {
writer->type = kIndexWriterTypeGopher;
writer->impl = gopher_writer;
writer->set_me_url = NULL;
- writer->begin = gopher_indexwriter_begin;
- writer->add_repo = gopher_indexwriter_add_repo;
- writer->end = gopher_indexwriter_end;
+ writer->begin = (IndexWriterVoidFunc)gopher_indexwriter_begin;
+ writer->add_repo = (IndexWriterRepoInfoFunc)gopher_indexwriter_add_repo;
+ writer->end = (IndexWriterVoidFunc)gopher_indexwriter_end;
return writer;
}
diff --git a/src/writer/repo_writer.c b/src/writer/repo_writer.c
@@ -104,14 +104,17 @@ RepoWriter* htmlrepowriter_create(GitRepo* repo) {
HtmlRepoWriter* html_writer = html_repowriter_create(repo);
writer->type = kRepoWriterTypeHtml;
writer->impl = html_writer;
- writer->set_log_cachefile = html_repowriter_set_log_cachefile;
- writer->set_log_commit_limit = html_repowriter_set_log_commit_limit;
- writer->set_baseurl = html_repowriter_set_baseurl;
- writer->begin = html_repowriter_begin;
- writer->add_commit = html_repowriter_add_commit;
- writer->add_reference = html_repowriter_add_reference;
- writer->add_file = html_repowriter_add_file;
- writer->end = html_repowriter_end;
+ writer->set_log_cachefile =
+ (RepoWriterSetLogCachefile)html_repowriter_set_log_cachefile;
+ writer->set_log_commit_limit =
+ (RepoWriterSetLogCommitLimit)html_repowriter_set_log_commit_limit;
+ writer->set_baseurl = (RepoWriterSetBaseurl)html_repowriter_set_baseurl;
+ writer->begin = (RepoWriterBegin)html_repowriter_begin;
+ writer->add_commit = (RepoWriterAddCommit)html_repowriter_add_commit;
+ writer->add_reference =
+ (RepoWriterAddReference)html_repowriter_add_reference;
+ writer->add_file = (RepoWriterAddFile)html_repowriter_add_file;
+ writer->end = (RepoWriterEnd)html_repowriter_end;
return writer;
}
@@ -131,14 +134,17 @@ RepoWriter* gopherrepowriter_create(GitRepo* repo) {
GopherRepoWriter* gopher_writer = gopher_repowriter_create(repo);
writer->type = kRepoWriterTypeGopher;
writer->impl = gopher_writer;
- writer->set_log_cachefile = gopher_repowriter_set_log_cachefile;
- writer->set_log_commit_limit = gopher_repowriter_set_log_commit_limit;
- writer->set_baseurl = gopher_repowriter_set_baseurl;
- writer->begin = gopher_repowriter_begin;
- writer->add_commit = gopher_repowriter_add_commit;
- writer->add_reference = gopher_repowriter_add_reference;
- writer->add_file = gopher_repowriter_add_file;
- writer->end = gopher_repowriter_end;
+ writer->set_log_cachefile =
+ (RepoWriterSetLogCachefile)gopher_repowriter_set_log_cachefile;
+ writer->set_log_commit_limit =
+ (RepoWriterSetLogCommitLimit)gopher_repowriter_set_log_commit_limit;
+ writer->set_baseurl = (RepoWriterSetBaseurl)gopher_repowriter_set_baseurl;
+ writer->begin = (RepoWriterBegin)gopher_repowriter_begin;
+ writer->add_commit = (RepoWriterAddCommit)gopher_repowriter_add_commit;
+ writer->add_reference =
+ (RepoWriterAddReference)gopher_repowriter_add_reference;
+ writer->add_file = (RepoWriterAddFile)gopher_repowriter_add_file;
+ writer->end = (RepoWriterEnd)gopher_repowriter_end;
return writer;
}