gout

A static git page generator
git clone https://git.bracken.jp/gout.git
Log | Files | Refs | README | LICENSE

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:
Msrc/writer/index_writer.c | 54+++++++++++++++++++++++++++++++++++++++++++++---------
Msrc/writer/repo_writer.c | 115++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------
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,