commit a447702df1d542aa2404dfad70a2d3c331a7cd46
parent b0a8eb0befef415b2a43366ae0dbef9829a79a09
Author: Chris Bracken <chris@bracken.jp>
Date: Sat, 21 Feb 2026 00:13:27 +0900
writer: replace func ptr cases with static wrapper init
This takes advantage of type-checking and avoids the risk of undefined
behaviour.
Diffstat:
2 files changed, 135 insertions(+), 34 deletions(-)
diff --git a/src/writer/index_writer.c b/src/writer/index_writer.c
@@ -21,20 +21,56 @@ struct IndexWriter {
void* impl;
};
+static void html_idx_set_me_url(void* impl, const char* url) {
+ html_indexwriter_set_me_url(impl, url);
+}
+
+static void html_idx_begin(void* impl) {
+ html_indexwriter_begin(impl);
+}
+
+static void html_idx_add_repo(void* impl, const GitRepo* repo) {
+ html_indexwriter_add_repo(impl, repo);
+}
+
+static void html_idx_end(void* impl) {
+ html_indexwriter_end(impl);
+}
+
+static void html_idx_free(void* impl) {
+ html_indexwriter_free(impl);
+}
+
static const IndexWriterOps kHtmlIndexWriterOps = {
- .set_me_url = (void (*)(void*, const char*))html_indexwriter_set_me_url,
- .begin = (void (*)(void*))html_indexwriter_begin,
- .add_repo = (void (*)(void*, const GitRepo*))html_indexwriter_add_repo,
- .end = (void (*)(void*))html_indexwriter_end,
- .free = (void (*)(void*))html_indexwriter_free,
+ .set_me_url = html_idx_set_me_url,
+ .begin = html_idx_begin,
+ .add_repo = html_idx_add_repo,
+ .end = html_idx_end,
+ .free = html_idx_free,
};
+static void gopher_idx_begin(void* impl) {
+ gopher_indexwriter_begin(impl);
+}
+
+static void gopher_idx_add_repo(void* impl, const GitRepo* repo) {
+ gopher_indexwriter_add_repo(impl, repo);
+}
+
+static void gopher_idx_end(void* impl) {
+ gopher_indexwriter_end(impl);
+}
+
+static void gopher_idx_free(void* impl) {
+ gopher_indexwriter_free(impl);
+}
+
static const IndexWriterOps kGopherIndexWriterOps = {
.set_me_url = NULL,
- .begin = (void (*)(void*))gopher_indexwriter_begin,
- .add_repo = (void (*)(void*, const GitRepo*))gopher_indexwriter_add_repo,
- .end = (void (*)(void*))gopher_indexwriter_end,
- .free = (void (*)(void*))gopher_indexwriter_free,
+ .begin = gopher_idx_begin,
+ .add_repo = gopher_idx_add_repo,
+ .end = gopher_idx_end,
+ .free = gopher_idx_free,
};
IndexWriter* indexwriter_create(IndexWriterType type, FILE* out) {
diff --git a/src/writer/repo_writer.c b/src/writer/repo_writer.c
@@ -25,35 +25,100 @@ struct RepoWriter {
void* impl;
};
+static void html_repo_set_log_cachefile(void* impl, const char* cachefile) {
+ html_repowriter_set_log_cachefile(impl, cachefile);
+}
+
+static void html_repo_set_log_commit_limit(void* impl, size_t count) {
+ html_repowriter_set_log_commit_limit(impl, count);
+}
+
+static void html_repo_set_baseurl(void* impl, const char* baseurl) {
+ html_repowriter_set_baseurl(impl, baseurl);
+}
+
+static void html_repo_begin(void* impl) {
+ html_repowriter_begin(impl);
+}
+
+static void html_repo_add_commit(void* impl, const GitCommit* commit) {
+ html_repowriter_add_commit(impl, commit);
+}
+
+static void html_repo_add_reference(void* impl, const GitReference* ref) {
+ html_repowriter_add_reference(impl, ref);
+}
+
+static void html_repo_add_file(void* impl, const GitFile* file) {
+ html_repowriter_add_file(impl, file);
+}
+
+static void html_repo_end(void* impl) {
+ html_repowriter_end(impl);
+}
+
+static void html_repo_free(void* impl) {
+ html_repowriter_free(impl);
+}
+
static const RepoWriterOps kHtmlRepoWriterOps = {
- .set_log_cachefile =
- (void (*)(void*, const char*))html_repowriter_set_log_cachefile,
- .set_log_commit_limit =
- (void (*)(void*, size_t))html_repowriter_set_log_commit_limit,
- .set_baseurl = (void (*)(void*, const char*))html_repowriter_set_baseurl,
- .begin = (void (*)(void*))html_repowriter_begin,
- .add_commit = (void (*)(void*, const GitCommit*))html_repowriter_add_commit,
- .add_reference =
- (void (*)(void*, const GitReference*))html_repowriter_add_reference,
- .add_file = (void (*)(void*, const GitFile*))html_repowriter_add_file,
- .end = (void (*)(void*))html_repowriter_end,
- .free = (void (*)(void*))html_repowriter_free,
+ .set_log_cachefile = html_repo_set_log_cachefile,
+ .set_log_commit_limit = html_repo_set_log_commit_limit,
+ .set_baseurl = html_repo_set_baseurl,
+ .begin = html_repo_begin,
+ .add_commit = html_repo_add_commit,
+ .add_reference = html_repo_add_reference,
+ .add_file = html_repo_add_file,
+ .end = html_repo_end,
+ .free = html_repo_free,
};
+static void gopher_repo_set_log_cachefile(void* impl, const char* cachefile) {
+ gopher_repowriter_set_log_cachefile(impl, cachefile);
+}
+
+static void gopher_repo_set_log_commit_limit(void* impl, size_t count) {
+ gopher_repowriter_set_log_commit_limit(impl, count);
+}
+
+static void gopher_repo_set_baseurl(void* impl, const char* baseurl) {
+ gopher_repowriter_set_baseurl(impl, baseurl);
+}
+
+static void gopher_repo_begin(void* impl) {
+ gopher_repowriter_begin(impl);
+}
+
+static void gopher_repo_add_commit(void* impl, const GitCommit* commit) {
+ gopher_repowriter_add_commit(impl, commit);
+}
+
+static void gopher_repo_add_reference(void* impl, const GitReference* ref) {
+ gopher_repowriter_add_reference(impl, ref);
+}
+
+static void gopher_repo_add_file(void* impl, const GitFile* file) {
+ gopher_repowriter_add_file(impl, file);
+}
+
+static void gopher_repo_end(void* impl) {
+ gopher_repowriter_end(impl);
+}
+
+static void gopher_repo_free(void* impl) {
+ gopher_repowriter_free(impl);
+}
+
static const RepoWriterOps kGopherRepoWriterOps = {
- .set_log_cachefile =
- (void (*)(void*, const char*))gopher_repowriter_set_log_cachefile,
- .set_log_commit_limit =
- (void (*)(void*, size_t))gopher_repowriter_set_log_commit_limit,
- .set_baseurl = (void (*)(void*, const char*))gopher_repowriter_set_baseurl,
- .begin = (void (*)(void*))gopher_repowriter_begin,
- .add_commit =
- (void (*)(void*, const GitCommit*))gopher_repowriter_add_commit,
- .add_reference =
- (void (*)(void*, const GitReference*))gopher_repowriter_add_reference,
- .add_file = (void (*)(void*, const GitFile*))gopher_repowriter_add_file,
- .end = (void (*)(void*))gopher_repowriter_end,
- .free = (void (*)(void*))gopher_repowriter_free,
+ .set_log_cachefile = gopher_repo_set_log_cachefile,
+ .set_log_commit_limit = gopher_repo_set_log_commit_limit,
+ .set_baseurl = gopher_repo_set_baseurl,
+ .begin = gopher_repo_begin,
+ .add_commit = gopher_repo_add_commit,
+ .add_reference = gopher_repo_add_reference,
+ .add_file = gopher_repo_add_file,
+ .end = gopher_repo_end,
+ .free = gopher_repo_free,
};
RepoWriter* repowriter_create(RepoWriterType type,