repo_writer.c (5047B)
1 #include "writer/repo_writer.h" 2 3 #include <err.h> 4 #include <stdlib.h> 5 6 #include "utils.h" 7 #include "writer/gopher/repo_writer.h" 8 #include "writer/html/repo_writer.h" 9 10 typedef void (*RepoWriterSetLogCachefile)(void* writer, const char* cachefile); 11 typedef void (*RepoWriterSetLogCommitLimit)(void* writer, size_t count); 12 typedef void (*RepoWriterSetBaseurl)(void* writer, const char* baseurl); 13 typedef void (*RepoWriterBegin)(void* writer); 14 typedef void (*RepoWriterAddCommit)(void* writer, const GitCommit* commit); 15 typedef void (*RepoWriterAddReference)(void* writer, const GitReference* ref); 16 typedef void (*RepoWriterAddFile)(void* writer, const GitFile* file); 17 typedef void (*RepoWriterEnd)(void* writer); 18 19 struct RepoWriter { 20 /* Writer implementation. */ 21 RepoWriterType type; 22 void* impl; 23 24 /* Writer configuration. */ 25 RepoWriterSetLogCachefile set_log_cachefile; 26 RepoWriterSetLogCommitLimit set_log_commit_limit; 27 RepoWriterSetBaseurl set_baseurl; 28 29 /* Writer operations. */ 30 RepoWriterBegin begin; 31 RepoWriterAddCommit add_commit; 32 RepoWriterAddReference add_reference; 33 RepoWriterAddFile add_file; 34 RepoWriterEnd end; 35 }; 36 37 static RepoWriter* htmlrepowriter_create(GitRepo* repo); 38 static void htmlrepowriter_free(RepoWriter* writer); 39 40 static RepoWriter* gopherrepowriter_create(GitRepo* repo); 41 static void gopherrepowriter_free(RepoWriter* writer); 42 43 RepoWriter* repowriter_create(RepoWriterType type, GitRepo* repo) { 44 switch (type) { 45 case kRepoWriterTypeHtml: 46 return htmlrepowriter_create(repo); 47 case kRepoWriterTypeGopher: 48 return gopherrepowriter_create(repo); 49 } 50 errx(1, "unknown RepoWriterType %d", type); 51 } 52 53 void repowriter_free(RepoWriter* writer) { 54 if (!writer) { 55 return; 56 } 57 switch (writer->type) { 58 case kRepoWriterTypeHtml: 59 htmlrepowriter_free(writer); 60 return; 61 case kRepoWriterTypeGopher: 62 gopherrepowriter_free(writer); 63 return; 64 } 65 errx(1, "unknown RepoWriterType %d", writer->type); 66 } 67 68 void repowriter_set_log_cachefile(RepoWriter* writer, const char* cachefile) { 69 writer->set_log_cachefile(writer->impl, cachefile); 70 } 71 72 void repowriter_set_log_commit_limit(RepoWriter* writer, size_t count) { 73 writer->set_log_commit_limit(writer->impl, count); 74 } 75 76 void repowriter_set_baseurl(RepoWriter* writer, const char* baseurl) { 77 writer->set_baseurl(writer->impl, baseurl); 78 } 79 80 void repowriter_begin(RepoWriter* writer) { 81 writer->begin(writer->impl); 82 } 83 84 void repowriter_add_commit(RepoWriter* writer, const GitCommit* commit) { 85 writer->add_commit(writer->impl, commit); 86 } 87 88 void repowriter_add_reference(RepoWriter* writer, const GitReference* ref) { 89 writer->add_reference(writer->impl, ref); 90 } 91 92 void repowriter_add_file(RepoWriter* writer, const GitFile* file) { 93 writer->add_file(writer->impl, file); 94 } 95 96 void repowriter_end(RepoWriter* writer) { 97 writer->end(writer->impl); 98 } 99 100 /* HtmlRepoWriter setup/teardown. */ 101 102 RepoWriter* htmlrepowriter_create(GitRepo* repo) { 103 RepoWriter* writer = ecalloc(1, sizeof(RepoWriter)); 104 HtmlRepoWriter* html_writer = html_repowriter_create(repo); 105 writer->type = kRepoWriterTypeHtml; 106 writer->impl = html_writer; 107 writer->set_log_cachefile = 108 (RepoWriterSetLogCachefile)html_repowriter_set_log_cachefile; 109 writer->set_log_commit_limit = 110 (RepoWriterSetLogCommitLimit)html_repowriter_set_log_commit_limit; 111 writer->set_baseurl = (RepoWriterSetBaseurl)html_repowriter_set_baseurl; 112 writer->begin = (RepoWriterBegin)html_repowriter_begin; 113 writer->add_commit = (RepoWriterAddCommit)html_repowriter_add_commit; 114 writer->add_reference = 115 (RepoWriterAddReference)html_repowriter_add_reference; 116 writer->add_file = (RepoWriterAddFile)html_repowriter_add_file; 117 writer->end = (RepoWriterEnd)html_repowriter_end; 118 return writer; 119 } 120 121 void htmlrepowriter_free(RepoWriter* writer) { 122 if (!writer) { 123 return; 124 } 125 html_repowriter_free(writer->impl); 126 writer->impl = NULL; 127 free(writer); 128 } 129 130 /* GopherRepoWriter setup/teardown. */ 131 132 RepoWriter* gopherrepowriter_create(GitRepo* repo) { 133 RepoWriter* writer = ecalloc(1, sizeof(RepoWriter)); 134 GopherRepoWriter* gopher_writer = gopher_repowriter_create(repo); 135 writer->type = kRepoWriterTypeGopher; 136 writer->impl = gopher_writer; 137 writer->set_log_cachefile = 138 (RepoWriterSetLogCachefile)gopher_repowriter_set_log_cachefile; 139 writer->set_log_commit_limit = 140 (RepoWriterSetLogCommitLimit)gopher_repowriter_set_log_commit_limit; 141 writer->set_baseurl = (RepoWriterSetBaseurl)gopher_repowriter_set_baseurl; 142 writer->begin = (RepoWriterBegin)gopher_repowriter_begin; 143 writer->add_commit = (RepoWriterAddCommit)gopher_repowriter_add_commit; 144 writer->add_reference = 145 (RepoWriterAddReference)gopher_repowriter_add_reference; 146 writer->add_file = (RepoWriterAddFile)gopher_repowriter_add_file; 147 writer->end = (RepoWriterEnd)gopher_repowriter_end; 148 return writer; 149 } 150 151 void gopherrepowriter_free(RepoWriter* writer) { 152 if (!writer) { 153 return; 154 } 155 gopher_repowriter_free(writer->impl); 156 writer->impl = NULL; 157 free(writer); 158 }