gout

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

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 }